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 en GitHub un ejemplo de este artículo.
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.Corea los--linkskip System.Coreen las opciones de compilación de iOS. - También puede establecer el comportamiento del enlazador de Xamarin.iOS en 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
Postspermite definir una relación de elemento primario y secundario entreBlogyPost.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
BlogIdyBlogvuelven a relacionarse con el objetoBlogprimario 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
DbSetse 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
OnConfiguringconfigura la ubicación de la base de datos de SQLite en el dispositivo físico.
Creación, lectura, actualización & eliminación
A continuación, se muestran algunas instancias de la aplicación en las que se usa EF Core para acceder a SQLite.
Leer
- Permite devolver todos los registros.
- La función
OnAppearingdeBlogsPage.xaml.csdevuelve todos los registrosBlogy 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
OnAppearingdePostsPage.xaml.csdevuelve registrosPostque contienen unBlogIdespecí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_ClickeddeAddBlogPage.xaml.csinserta un nuevo objetoBlogen 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_ClickeddeAddPostPage.xaml.csactualiza un objetoBlogexistente con unPostnuevo.
- 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_ClickeddeBlogsPage.xaml.cselimina todos los registros deBlogde la base de datos de SQLite y elimina en cascada todos los registros dePostsecundarios 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
- Obtenga más información sobre las expresiones de consulta LINQ.
- Configure su modelo para especificar aspectos como requerido y longitud máxima.