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:
- Visual Studio 2019, versión 16.3 o posterior, con esta carga de trabajo:
- Desarrollo móvil con .NET
- Visual Studio para Mac
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.
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.
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.
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.
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.
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 entreBlog
yPost
.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
yBlog
vuelven a relacionarse con el objetoBlog
primario de la instancia dePost
.
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
deBlogsPage.xaml.cs
devuelve todos los registrosBlog
y los almacena en una variableList
.
- La función
using (var blogContext = new BloggingContext())
{
var theBlogs = blogContext.Blogs.ToList();
}
- Permite devolver registros específicos.
- La función
OnAppearing
dePostsPage.xaml.cs
devuelve registrosPost
que contienen unBlogId
específico.
- La función
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
deAddBlogPage.xaml.cs
inserta un nuevo objetoBlog
en la base de datos de SQLite.
- La función
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
deAddPostPage.xaml.cs
actualiza un objetoBlog
existente con unPost
nuevo.
- La función
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
deBlogsPage.xaml.cs
elimina todos los registros deBlog
de la base de datos de SQLite y elimina en cascada todos los registros dePost
secundarios deBlog
.
- La función
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:
- Configuración de
DbContext
- Obtenga más información sobre las expresiones de consulta LINQ.
- Configure su modelo para especificar aspectos como requerido y longitud máxima.