Compartir a través de


Introducción a Entity Framework Core

En este tutorial, creará una aplicación de Xamarin.Forms que realiza el acceso a datos en una base de datos de SQLite mediante Entity Framework Core.

Puede seguir el tutorial mediante Visual Studio en Windows o Visual Studio para Mac.

Propina

Puede ver el ejemplo de de este artículo en GitHub.

Prerrequisitos

Instale uno de los siguientes:

Esta documentación de proporciona instrucciones detalladas de instalación paso a paso para cada plataforma.

Descarga y ejecución del proyecto de ejemplo

Para ejecutar y explorar esta aplicación de ejemplo, descargue el código en GitHub.

Una vez descargado, abra el archivo de solución EFGettingStarted.sln en Visual Studio o Visual Studio para Mac y ejecute la aplicación en la plataforma que prefiera.

Cuando se inicie la aplicación por primera vez, rellenará la base de datos local de SQLite con dos entradas que representan blogs.

Captura de pantalla de todas las páginas de lista de blogs

Haga clic en el botón Agregar de la barra de herramientas.

Aparecerá una nueva página que le permite escribir información sobre un nuevo blog.

Captura de pantalla de la nueva página de edición de blog

Rellene toda la información necesaria y haga clic en Guardar en la barra de herramientas. El nuevo blog se guardará en la base de datos sqLite de la aplicación y se mostrará en la lista.

Puede hacer clic en una de las entradas del blog de la lista y ver las entradas de ese blog.

Captura de pantalla de la página de lista de entradas de blog

Haga clic en Agregar en la barra de herramientas.

A continuación, aparece una página que le permite rellenar información sobre una nueva entrada de blog.

Captura de pantalla de la página de agregar nueva publicación

Rellene toda la información y haga clic en Guardar en la barra de herramientas.

La nueva entrada se asociará a la entrada de blog en la que ha clic en un paso anterior y se guardará en la base de datos sqLite de la aplicación y se mostrará en la lista.

Vuelva a la página de la lista de blog. Y haga clic en Eliminar todo en la barra de herramientas. Todos los blogs y sus publicaciones correspondientes se eliminarán de la base de datos SQLite de la aplicación.

Captura de pantalla de la aplicación con todos los blogs eliminados

Exploración del código

Las secciones siguientes le guiarán por el código del proyecto de ejemplo que lee, crea, actualiza y elimina datos de una base de datos de SQLite mediante EF Core con Xamarin.Forms.

Se supone que está familiarizado con los temas de Xamarin.Forms de mostrar datos y navegar entre páginas.

Importante

Entity Framework Core usa la reflexión para invocar funciones que el enlazador de Xamarin.iOS puede quitar mientras se encuentra en configuraciones del modo versión. Puede evitarlo de una de estas dos maneras.

  • La primera consiste en agregar --linkskip System.Core a los argumentos adicionales mtouch en las opciones de compilación de iOS .
  • También puede establecer el comportamiento del Enlazador de Xamarin.iOS a Don't Link en las opciones de compilación de iOS . En este artículo se explica más sobre el enlazador de Xamarin.iOS, incluido cómo establecer el comportamiento en Xamarin.iOS. (Este enfoque no es ideal, ya que puede provocar el rechazo de la tienda).

Paquetes NuGet de Entity Framework Core

Para crear aplicaciones de Xamarin.Forms con EF Core, instale el paquete para los proveedores de bases de datos de EF Core que desea tener como destino en todos los proyectos de la solución de Xamarin.Forms. En este tutorial se usa el proveedor de SQLite.

El siguiente paquete NuGet es necesario en cada uno de los proyectos de la solución Xamarin.Forms.

  • Microsoft.EntityFrameworkCore.Sqlite

Clases de modelo

Cada tabla de la base de datos de SQLite a la que se accede a través de EF Core se modela en una clase . En este ejemplo, se usan dos clases: Blog y Post que se pueden encontrar en la carpeta Models.

Las clases de modelo se componen solo de propiedades, que modelan columnas de la base de datos.

  • Blog.cs

    using System;
    using System.Collections.Generic;
    
    namespace EFGetStarted
    {
        public class Blog
        {
            public int BlogId { get; set; }
            public string Url { get; set; }
    
            public List<Post> Posts { get; set; } = new List<Post>();
        }
    }
    
  • La propiedad Posts define una relación padre-hijo entre Blog y Post.

  • Post.cs

    using System;
    namespace EFGetStarted
    {
        public class Post
        {
            public int PostId { get; set; }
            public string Title { get; set; }
            public string Content { get; set; }
    
            public int BlogId { get; set; }
            public Blog Blog { get; set; }
        }
    }
    
  • Las propiedades BlogId y Blog se relacionan con el objeto Blog primario de la instancia de Post.

Contexto de datos

La clase BloggingContext se encuentra en la carpeta Services y hereda de la clase DbContext de EF Core. Un DbContext se usa para agrupar consultas y cambios de base de datos.

using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Xamarin.Essentials;

namespace EFGetStarted
{
    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        public BloggingContext()
        {
            SQLitePCL.Batteries_V2.Init();

            this.Database.EnsureCreated();
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string dbPath = Path.Combine(FileSystem.AppDataDirectory, "blogs.db3");

            optionsBuilder
                .UseSqlite($"Filename={dbPath}");
        }
    }
}
  • Ambas propiedades de esta clase de tipo DbSet se usan para operar en las tablas subyacentes que representan blogs y publicaciones.
  • El SQLitePCL.Batteries_V2.Init() es necesario en el constructor para iniciar SQLite en iOS.
  • La función OnConfiguring configura la ubicación de la base de datos de SQLite en el dispositivo físico.

Crear, leer, actualizar & eliminar

A continuación se muestran algunas instancias de la aplicación donde se usa EF Core para acceder a SQLite.

Leer

  • Devuelve todos los registros.

    • La función OnAppearing de BlogsPage.xaml.cs devuelve todos los registros Blog y los almacena en una variable List.

      using (var blogContext = new BloggingContext())
      {
          var theBlogs = blogContext.Blogs.ToList();
      }
      
  • Devuelve registros específicos.

    • La función OnAppearing de PostsPage.xaml.cs devuelve registros Post que contienen un BlogIdespecífico.

      using (var blogContext = new BloggingContext())
      {
          var postList = blogContext.Posts
              .Where(p => p.BlogId == BlogId)
              .ToList();
      }
      

Crear

  • Inserte un nuevo registro.
    • La función Save_Clicked de AddBlogPage.xaml.cs inserta un nuevo objeto Blog en la base de datos SQLite.

      var blog = new Blog { Url = blogUrl.Text };
      
      using (var blogContext = new BloggingContext())
      {
          blogContext.Add(blog);
      
          await blogContext.SaveChangesAsync();
      }
      

Actualizar

  • Actualice un registro existente.
    • La función Save_Clicked de AddPostPage.xaml.cs actualiza un objeto de Blog existente con un nuevo Post.

      var newPost = new Post
      {
          BlogId = BlogId,
          Content = postCell.Text,
          Title = titleCell.Text
      };
      
      using (var blogContext = new BloggingContext())
      {
          var blog = await blogContext
              .Blogs
              .FirstAsync(b => b.BlogId == BlogId);
      
          blog.Posts.Add(newPost);
      
          await blogContext.SaveChangesAsync();
      }
      

Borrar

  • Elimine todos los registros con eliminación en cascada a los registros secundarios.
    • La función DeleteAll_Clicked de BlogsPage.xaml.cs elimina todos los registros de Blog de la base de datos de SQLite y aplica en cascada las eliminaciones a todos los registros Post secundarios de Blog.

      using (var blogContext = new BloggingContext())
      {
          blogContext.RemoveRange(blogContext.Blogs);
      
          await blogContext.SaveChangesAsync();
      }
      

Pasos siguientes

En esta introducción ha aprendido a usar una aplicación de Xamarin.Forms para acceder a una base de datos de SQLite mediante Entity Framework Core.