top of page

EF Core en una aplicación UWP

Actualizado: 7 may 2020

El primer post del blog hablaremos sobre como adherir o utilizar EntityFramework Core al diseñar una aplicación UWP.


Requisitos

 
  • Windows 10 versión 1909

  • Visual Studio Community 2019

  • EF Core 1.1.6

  • Min versión: Windows 10 Creators Update (10.0; Build 15063) al crear la aplicación UWP


Nota: EntityFramework Core esta disponible en la mayoría de las implementaciones modernas de .NET, solo algunas implementaciones presentan problemas como Mono, Xamarin y UWP. Debido a ello, optaremos por la versión 1.1.6 de EntityFramework Core pues es la única que funciona sin tener que optar por algún proyecto intermediario.

Proceso

 

1. Crearemos 3 proyectos en una solución: Una aplicación UWP y 2 librerías de clase (UWP), haciendo uso de la separación de intereses como buena práctica de programación.

2. Instalamos los paquetes nuget correspondientes:

  • Microsoft.EntityFrameworkCore.Sqlite v1.1.6 en el proyecto EFCoreApp.Data

  • Microsoft.EntityFrameworkCore.Tools v1.1.6 en el proyecto EFCoreApp.Model

3. Luego creamos creamos los modelos de datos (Cliente.cs) en el proyecto EFCoreApp.Model y datos (EFCoreDbContext.cs) en el proyecto EFCoreApp.Data, que este último implementara el DbContext (librería que ofrece EFCore).

4. Adherimos las siguientes propiedades a la clase "Cliente" y dichas propiedades servirán paralelamente como campo para nuestra server-less database en SQLite.

namespace EFCoreApp.Model
{
    public class Cliente
    {
        public int Id { get; set; }
        public string Nombres { get; set; }
        public string Apellidos { get; set; }
        public int Dni { get; set; }
        public string Direccion { get; set; }
    }
}

5. Luego la clase EFCoreDbContext heredará propiedades y métodos de la clase DbContext e implementaremos ciertas propiedades que definirán las tablas de la base de datos y sobrescribiremos el método OnConfiguring que definirá el nombre de la base de datos.


Nota: Como las clases "Cliente" y "EfCoreDbContext" estan en diferentes proyectos, tendremos que referenciar desde el proyecto EFCoreApp.Data al proyecto EFCoreApp.Model asi:


La clase EFCoreDBContext deberá quedar asi:

using EFCoreApp.Model;
using Microsoft.EntityFrameworkCore;

namespace EFCoreApp.Data
{
    public class EFCoreDbContext : DbContext
    {
        public DbSet<Cliente> Clientes { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Data Source=EFCoreApp.db");
            base.OnConfiguring(optionsBuilder);
        }
    }
}

6. Habiendo terminado todos estos pasos anteriores, realizaremos la primera migración, que al ejecutar el proyecto mas adelante creará la base de datos. Pero antes referenciaremos a los proyectos EFCoreApp.Data y EFCoreApp.Model desde la aplicación UWP, luego estableceremos como proyecto de inicio a la aplicación UWP y dentro del Packge Manager Console seleccionaremos al proyecto EFCoreApp.Data como proyecto determinado por defecto, finalmente ejecutaremos el siguiente comando:

add-migration init

De esta manera:

7. Antes crear la base de datos tenemos que crear una instancia de EFCoreDbContext en App.xaml.cs y llamar al método Migrate:


Nota: Esta forma de crear la base de datos es poco ortodoxa, porque generalmente optaríamos por ejecutar el comando Update-Database dentro del Package Manager Console. Sin embargo EF Core aun presente problemas de compatibilidad al momento de usar UWP.


8. Ejecutamos el aplicativo UWP y paralelamente al hacer esta acción estaríamos creando la base de datos.


Utilizando EF Core

 

Habiendo creando la base de datos, solo nos queda reflejarlo en la aplicación UWP, para ello crearemos un interfaz de usuario muy simple sin ningún patrón de diseño como "MVVM" y diseñaremos la aplicación con una arquitectura "code behind" que no es considerada un buena practica de programación pero para fines del presente tutorial considero que es más que suficiente.


Teniendo el archivo MainPage.xaml:

<Page
    x:Class="EFCoreApp.UWP.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:EFCoreApp.UWP"
    xmlns:model="using:EFCoreApp.Model"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    Loaded="Page_Loaded">

    <StackPanel>
        
        <TextBlock Text="Cliente"
                   FontSize="54" 
                   FontWeight="Bold" 
                   HorizontalAlignment="Center"
                   VerticalAlignment="Center"/>

        <TextBox x:Name="IdTextBox" 
                 Header="Id:" 
                 Grid.Row="1"
                 Width="250" 
                 IsEnabled="False"/>
        <TextBox x:Name="NombreTextBox" 
                 Header="Nombre:" 
                 Grid.Row="2" 
                 Width="250"/>
        <TextBox x:Name="ApellidosTextBox" 
                 Header="Nombre:" 
                 Grid.Row="3" 
                 Width="250"/>
        <TextBox x:Name="DniTextBox" 
                 Header="Dni:" 
                 Grid.Row="4" 
                 Width="250"/>
        <TextBox x:Name="DireccionTextBox" 
                 Header="Direccion:"
                 Grid.Row="5" 
                 Width="250"/>
        
        <Button x:Name="GuardarButton" 
                Content="Guardar"
                HorizontalAlignment="Center" 
                Click="GuardarButton_Click"/>
        
        <ListView x:Name="ClientesListView" BorderBrush="Gray" BorderThickness="2">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="model:Cliente">
                    <StackPanel>
                        <TextBlock Text="{x:Bind Nombres}" FontWeight="Bold"/>
                        <TextBlock Text="{x:Bind Apellidos}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

    </StackPanel>
</Page>

Y MainPage.xml.cs:

using EFCoreApp.Data;
using EFCoreApp.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.ServiceModel;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace EFCoreApp.UWP
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            using (var db = new EFCoreDbContext())
            {
                var clientes = db.Clientes.ToList();
                if (clientes != null)
                {
                    ClientesListView.ItemsSource = clientes;
                }
            }
        }

        private void GuardarButton_Click(object sender, RoutedEventArgs e)
        {
            using (var db = new EFCoreDbContext())
            {
                int dni;
                int.TryParse(DniTextBox.Text, out dni);

                var cliente = new Cliente
                {
                    Nombres = NombreTextBox.Text,
                    Apellidos = ApellidosTextBox.Text,
                    Dni = dni,
                    Direccion = DireccionTextBox.Text,
                };

                db.Clientes.Add(cliente);
                db.SaveChanges();
                ClientesListView.ItemsSource = db.Clientes.ToList();
            }
        }
    }
}

Ejecutando la aplicación podemos observar lo siguiente:

Espero les haya gustado el post, cualquier consulta no duden en hacerla... Yo estaré encanto de responder.

Para finalizar quiero añadir que EF Core es una herramienta muy útil y como tal tiene sus ventajas y desventajas. Asimismo, EF Core se actualiza constantemente, no sería una sorpresa que algunas inconsistencias se solucionaran con el pasar del tiempo.

Dejo el link del aplicativo alojado en Github:

Saludos!

136 visualizaciones0 comentarios

Entradas recientes

Ver todo
bottom of page