Introdução ao EF Core e ao Xamarin
Neste tutorial, você criará um aplicativo Xamarin.Forms que executa o acesso a dados em um banco de dados SQLite usando o Entity Framework Core.
Você pode seguir o tutorial usando o Visual Studio no Windows ou no Visual Studio para Mac.
Dica
Veja o exemplo deste artigo no GitHub.
Pré-requisitos
Instale um dos seguintes:
- Visual Studio 2019 versão 16.3 ou posterior com esta carga de trabalho:
- Desenvolvimento para dispositivos móveis com .NET
- Visual Studio para Mac
Esta documentação fornece instruções passo a passo detalhadas de instalação para cada plataforma.
Baixar e executar o projeto de exemplo
Para executar e explorar este aplicativo de exemplo, baixe o código no GitHub.
Depois de baixado, abra o arquivo EFGettingStarted.sln
de solução no Visual Studio ou no Visual Studio para Mac e execute o aplicativo na plataforma de sua escolha.
Quando o aplicativo for iniciado pela primeira vez, ele preencherá o banco de dados SQLite local com duas entradas que representam blogs.
Clique no botão Adicionar na barra de ferramentas.
Uma nova página será exibida que permite que você insira informações sobre um novo blog.
Preencha todas as informações e clique em Salvar na barra de ferramentas. O novo blog salvará no banco de dados SQLite do aplicativo e será exibido na lista.
Você pode clicar em uma das entradas do blog na lista e ver as postagens desse blog.
Clique em Adicionar na barra de ferramentas.
Em seguida, aparece uma página que permite que você preencha informações sobre uma nova postagem no blog.
Preencha todas as informações e clique em Salvar na barra de ferramentas.
A nova postagem será associada à postagem no blog em que você clicou em uma etapa anterior e será salva no banco de dados SQLite do aplicativo e mostrada na lista.
Volte para a página da lista de blogs. E clique em Excluir tudo na barra de ferramentas. Todos os blogs e suas postagens correspondentes serão excluídos do banco de dados SQLite do aplicativo.
Explore o código
As seções a seguir orientarão você sobre o código no projeto de exemplo que lê, cria, atualiza e exclui dados de um banco de dados SQLite usando o EF Core com o Xamarin.Forms.
Supõe-se que você esteja familiarizado com os tópicos do Xamarin.Forms de exibir dados e navegar entre páginas.
Importante
O Entity Framework Core usa reflexão para invocar funções que o vinculador Xamarin.iOS pode remover durante as configurações do modo de Versão. Você pode evitar isso de duas maneiras.
- A primeira é adicionar
--linkskip System.Core
aos Argumentos mtouch adicionais nas opções de build do iOS. - Como alternativa, defina o comportamento do vinculador do Xamarin.iOS como
Don't Link
nas opções de build do iOS. Este artigo explica mais sobre o vinculador do Xamarin.iOS, incluindo como definir o comportamento no Xamarin.iOS. (Essa abordagem não é ideal, pois pode resultar em rejeição do repositório).
Pacotes NuGet do Entity Framework Core
Para criar aplicativos Xamarin.Forms com o EF Core, instale o pacote para os provedores de banco de dados EF Core que você deseja direcionar para todos os projetos na solução Xamarin.Forms. Este tutorial usa o provedor SQLite.
O seguinte pacote NuGet é necessário em cada um dos projetos na solução Xamarin.Forms.
Microsoft.EntityFrameworkCore.Sqlite
Classes de modelo
Cada tabela no banco de dados SQLite acessada por meio do EF Core é modelada em uma classe. Neste exemplo, duas classes são usadas: Blog
e Post
, que podem ser encontradas na pasta Models
.
As classes de modelo são compostas apenas por propriedades, que modelam as colunas no banco de dados.
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>(); } }
A propriedade
Posts
define uma relação pai-filho entreBlog
ePost
.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; } } }
As propriedades
BlogId
eBlog
se relacionam de volta ao objeto paiBlog
para a instância dePost
.
Contexto de dados
A classe BloggingContext
está localizada na pasta Services
e herda da classe EF Core DbContext
. Um DbContext
é usado para agrupar consultas e alterações de banco de dados.
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 as propriedades nessa classe de tipo
DbSet
são usadas para operar nas tabelas subjacentes que representam Blogs e Postagens. - O construtor
SQLitePCL.Batteries_V2.Init()
é necessário para iniciar o SQLite no iOS. - A função
OnConfiguring
configura o local do banco de dados SQLite no dispositivo físico.
Criar, ler, atualizar e excluir
Veja a seguir algumas instâncias no aplicativo em que o EF Core é usado para acessar o SQLite.
Ler
- Retorne todos os registros.
- A função
OnAppearing
deBlogsPage.xaml.cs
retorna todos os registrosBlog
e os armazena em uma variávelList
.
- A função
using (var blogContext = new BloggingContext())
{
var theBlogs = blogContext.Blogs.ToList();
}
- Retornar registros específicos.
- A função
OnAppearing
dePostsPage.xaml.cs
retorna registrosPost
que contêm umBlogId
específico.
- A função
using (var blogContext = new BloggingContext())
{
var postList = blogContext.Posts
.Where(p => p.BlogId == BlogId)
.ToList();
}
Criar
- Insira um novo registro.
- A função
Save_Clicked
deAddBlogPage.xaml.cs
insere um novo objetoBlog
no banco de dados SQLite.
- A função
var blog = new Blog { Url = blogUrl.Text };
using (var blogContext = new BloggingContext())
{
blogContext.Add(blog);
await blogContext.SaveChangesAsync();
}
Atualizar
- Atualize um registro existente.
- A função
Save_Clicked
deAddPostPage.xaml.cs
atualizar um objetoBlog
existente com um novoPost
.
- A função
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();
}
Delete
- Exclua todos os registros com cascata para registros filho.
- A função
DeleteAll_Clicked
deBlogsPage.xaml.cs
exclui todos os registrosBlog
no banco de dados SQLite e propaga as exclusões para todos os registrosBlog
filhoPost
.
- A função
using (var blogContext = new BloggingContext())
{
blogContext.RemoveRange(blogContext.Blogs);
await blogContext.SaveChangesAsync();
}
Próximas etapas
Nesta introdução, você aprendeu a usar um aplicativo Xamarin.Forms para acessar um banco de dados SQLite usando o Entity Framework Core.
Outros tópicos de interesse do Entity Framework Core para desenvolvedores do Xamarin:
- Configurando um
DbContext
- Saiba mais sobre as expressões de consulta LINQ
- Configure seu modelo para especificar configurações como obrigatório e comprimento máximo