Начало работы с EF Core и Xamarin
В этом руководстве вы создадите приложение Xamarin.Forms, которое осуществляет доступ к базе данных SQLite с помощью Entity Framework Core.
Инструкции из этого руководства можно выполнять с помощью Visual Studio в Windows или Visual Studio для Mac.
Совет
Вы можете скачать используемый в этой статье пример из репозитория GitHub.
Необходимые компоненты
Установите одно из следующих приложений:
- Visual Studio 2019 версии 16.3 или более поздней с этой рабочей нагрузкой:
- Разработка мобильных приложений на .NET
- Visual Studio для Mac
В этой документации содержатся подробные пошаговые инструкции по установке для каждой платформы.
Скачивание и запуск примера проекта
Чтобы запустить и изучить этот пример приложения, скачайте код на сайте GitHub.
После скачивания откройте файл решения EFGettingStarted.sln
в Visual Studio или Visual Studio для Mac и запустите приложение на выбранной платформе.
При первом запуске приложения локальная база данных SQLite будет заполнена двумя записями, представляющими блоги.
На панели инструментов нажмите кнопку Add (Добавить).
Появится новая страница, на которой можно ввести сведения о новом блоге.
Введите все сведения и на панели инструментов нажмите кнопку Save (Сохранить). Новый блог сохранится в базе данных SQLite приложения и появится в списке.
Вы можете щелкнуть одну из записей блога в списке и просмотреть все записи в этом блоге.
На панели инструментов нажмите кнопку Add (Добавить).
Появится страница, на которой можно ввести сведения о новой записи блога.
Введите все сведения и на панели инструментов нажмите кнопку Save (Сохранить).
Новая запись будет связана с записью блога, которую вы выбрали на предыдущем шаге, сохранится в базе данных SQLite приложения и появится в списке.
Вернитесь на страницу со списком блогов. На панели инструментов нажмите кнопку Delete All (Удалить все). Все блоги и соответствующие записи будут удалены из базы данных SQLite приложения.
Обзор кода
В следующих разделах последовательно разбирается код из образца проекта, который считывает, создает, обновляет и удаляет данные в базе данных SQLite с помощью EF Core с Xamarin.Forms.
Предполагается, что вы знаете как отображать данные и переходить между страницами с помощью Xamarin.Forms.
Важно!
Entity Framework Core применяет отражение для вызова функций, которые компоновщик Xamarin.iOS может исключить, если используются конфигурации режима Выпуск. Предотвратить это можно одним из двух способов.
- Первый способ: добавьте
--linkskip System.Core
в поле Дополнительные аргументы mtouch в параметрах сборки iOS. - Второй способ: в параметрах сборки iOS задайте для параметра Поведение компоновщика Xamarin.iOS значение
Don't Link
. Дополнительные сведения о компоновщике Xamarin.iOS, включая настройку его поведения для Xamarin.iOS, приведены в этой статье. Такой подход не идеален, так как он может стать причиной отклонения в магазине.
Пакеты Entity Framework Core NuGet
Чтобы создавать приложения Xamarin.Forms с помощью EF Core, установите пакеты целевых поставщиков базы данных EF Core, с которыми вы будете работать, во все проекты в решении Xamarin.Forms. В этом руководстве используется поставщик SQLite.
В каждом из проектов решения Xamarin.Forms требуется указанный ниже пакет NuGet.
Microsoft.EntityFrameworkCore.Sqlite
Классы модели
Каждая таблица в базе данных SQLite, доступ к которой осуществляется через EF Core, моделируется в классе. В этом примере используются два класса: Blog
и Post
. Они находятся в папке Models
.
Классы модели состоят только из свойств, которые моделируют столбцы в базе данных.
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>(); } }
Свойство
Posts
определяет связь "родитель-потомок" междуBlog
и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; } } }
Свойства
BlogId
иBlog
определяют обратные связи с родительским объектомBlog
для экземпляраPost
.
Контекст данных
Класс BloggingContext
находится в папке Services
и наследуется от класса EF Core DbContext
. DbContext
используется для группирования запросов к базе данных и изменений.
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}");
}
}
}
- Оба свойства в этом классе типа
DbSet
служат для работы с базовыми таблицами, представляющими блоги и записи. SQLitePCL.Batteries_V2.Init()
требуется в конструкторе для инициации SQLite в iOS.- Функция
OnConfiguring
задает расположение базы данных SQLite на физическом устройстве.
Создание, чтение, обновление и удаление
Ниже приведены некоторые места в приложении, где EF Core используется для доступа к SQLite.
Читать
- Возврат всех записей.
- Функция
OnAppearing
вBlogsPage.xaml.cs
возвращает все записиBlog
и сохраняет их в переменнойList
.
- Функция
using (var blogContext = new BloggingContext())
{
var theBlogs = blogContext.Blogs.ToList();
}
- Возврат определенных записей.
- Функция
OnAppearing
вPostsPage.xaml.cs
возвращает записиPost
, содержащие определенное значениеBlogId
.
- Функция
using (var blogContext = new BloggingContext())
{
var postList = blogContext.Posts
.Where(p => p.BlogId == BlogId)
.ToList();
}
Создание
- Вставка новой записи.
- Функция
Save_Clicked
вAddBlogPage.xaml.cs
вставляет новый объектBlog
в базу данных SQLite.
- Функция
var blog = new Blog { Url = blogUrl.Text };
using (var blogContext = new BloggingContext())
{
blogContext.Add(blog);
await blogContext.SaveChangesAsync();
}
Обновить
- Изменение существующей записи.
- Функция
Save_Clicked
вAddPostPage.xaml.cs
изменяет существующий объектBlog
, используя новый объект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();
}
DELETE
- Удаление всех записей, включая дочерние.
- Функция
DeleteAll_Clicked
вBlogsPage.xaml.cs
удаляет все записиBlog
в базе данных SQLite, распространяя удаление на все дочерние записиPost
объектаBlog
.
- Функция
using (var blogContext = new BloggingContext())
{
blogContext.RemoveRange(blogContext.Blogs);
await blogContext.SaveChangesAsync();
}
Следующие шаги
В этом кратком руководстве вы узнали, как использовать приложение Xamarin.Forms для доступа к базе данных SQLite с помощью Entity Framework Core.
Другие разделы по Entity Framework Core, которые могут представлять интерес для разработчиков Xamarin:
- Настройка
DbContext
- См. сведения о выражениях запросов LINQ.
- Настройте модель, указав требуемую и максимальную длину.