Compartir vía


Primeros pasos con EF Core y Xamarin

En este tutorial, crearemos una aplicación de consola 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.

Sugerencia

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

Requisitos previos

Instale la opción que corresponda:

En esta documentación se proporcionan instrucciones de instalación paso a paso detalladas para cada plataforma.

Descarga y ejecución del proyecto de ejemplo

Para ejecutar y explorar esta aplicación de ejemplo, descargue el código disponible 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 de su elección.

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

Screenshot of all blogs list page

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

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

Screenshot of new blog edit page

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

Puede hacer clic en una de las entradas de blog de la lista y ver cualquier publicación de dicho blog.

Screenshot of blog posts list page

En la barra de herramientas, haga clic en Agregar.

Aparecerá una página que le permitirá rellenar información sobre una nueva entrada de blog.

Screenshot of add new post page

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

La nueva publicación se asociará a la entrada de blog en la que hizo clic en el paso anterior, se guardará en la base de datos de SQLite de la aplicación y se mostrará en la lista.

Vuelva a la página de la lista de blogs. 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 de SQLite de la aplicación.

Screenshot of app with all blogs deleted

Exploración del código

Las secciones siguientes le guiarán a través del 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 da por hecho que está familiarizado con los temas de Xamarin.Forms relacionados con la visualización de datos y la navegación por las páginas.

Importante

Entity Framework Core usa la reflexión para invocar funciones que el enlazador de Xamarin.iOS puede quitar mientras está en las configuraciones de modo de versión. Puede evitarlo de dos maneras.

  • La primera es agregar --linkskip System.Core a los argumentos de mtouch adicionales en las opciones de compilación de iOS.
  • También puede establecer el comportamiento del enlazador de Xamarin.iOS en 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 idóneo, ya que puede dar lugar a un rechazo del almacén).

Paquetes NuGet de Entity Framework Core

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

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

  • Microsoft.EntityFrameworkCore.Sqlite

Clases de modelo

Cada tabla de la base de datos de SQLite a la que se tiene acceso 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 únicamente de propiedades, que modelan las 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 permite definir una relación de elemento primario y secundario 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 vuelven a relacionarse 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 EF Core DbContext. DbContext se utiliza para agrupar las consultas y los cambios de la 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.
  • 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.

Creación, lectura, actualización y eliminación

A continuación, se muestran algunas instancias de la aplicación en las que se usa EF Core para acceder a SQLite.

Lectura

  • Permite devolver 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();
}
  • Permite devolver registros específicos.
    • La función OnAppearing de PostsPage.xaml.cs devuelve registros Post que contienen un BlogId específico.
using (var blogContext = new BloggingContext())
{
    var postList = blogContext.Posts
        .Where(p => p.BlogId == BlogId)
        .ToList();
}

Crear

  • Permite insertar un nuevo registro.
    • La función Save_Clicked de AddBlogPage.xaml.cs inserta un nuevo objeto Blog en la base de datos de SQLite.
var blog = new Blog { Url = blogUrl.Text };

using (var blogContext = new BloggingContext())
{
    blogContext.Add(blog);

    await blogContext.SaveChangesAsync();
}

Actualizar

  • Permite actualizar un registro existente.
    • La función Save_Clicked de AddPostPage.xaml.cs actualiza un objeto Blog existente con un Post nuevo.
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();
}

Eliminar

  • Permite eliminar todos los registros en cascada en 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 elimina en cascada todos los registros de 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 tener acceso a una base de datos de SQLite mediante Entity Framework Core.

Otros temas de Entity Framework Core de interés para los desarrolladores de Xamarin: