Начало работы с Entity Framework Core
В этом руководстве вы создадите приложение Xamarin.Forms, которое выполняет доступ к данным для базы данных SQLite с помощью Entity Framework Core.
Руководство можно выполнить с помощью Visual Studio в Windows или Visual Studio для Mac.
Совет
Необходимые условия
Установите один из следующих вариантов:
-
Visual Studio 2019 версии 16.3 или более поздней версии с этой рабочей нагрузкой:
- Разработка мобильных приложений с помощью .NET
- Visual Studio для Mac
Эта документация содержит подробные пошаговые инструкции по установке для каждой платформы.
Скачивание и запуск примера проекта
Чтобы запустить и изучить это пример приложения, скачайте код на GitHub.
После скачивания откройте файл решения EFGettingStarted.sln
в Visual Studio или Visual Studio для Mac и запустите приложение на выбранной платформе.
При первом запуске приложение заполняет локальную базу данных SQLite двумя записями, представляющими блоги.
Нажмите кнопку Добавить на панели инструментов.
Появится новая страница, которая позволяет вводить сведения о новом блоге.
Заполните все сведения и нажмите кнопку Сохранить на панели инструментов. Новый блог сохранится в базе данных SQLite приложения и отобразится в списке.
Вы можете щелкнуть одну из записей блога в списке и просмотреть все записи для этого блога.
Нажмите Добавить на панели инструментов.
Откроется страница, которая позволяет заполнить сведения о новой записи блога.
Заполните всю информацию и нажмите кнопку Сохранить на панели инструментов.
Новая запись будет связана с записью блога, на которую вы щелкнули на предыдущем шаге, сохранена в базе данных SQLite приложения и отображена в списке.
Вернитесь на страницу списка блогов. Щелкните Удалить все на панели инструментов. Затем все блоги и соответствующие записи будут удалены из базы данных SQLite приложения.
Изучение кода
В следующих разделах описан код в примере проекта, который считывает, создает, обновляет и удаляет данные из базы данных SQLite с помощью EF Core с Xamarin.Forms.
Предполагается, что вы знакомы с разделами Xamarin.Forms отображения данных и навигации между страницами.
Важный
Entity Framework Core использует рефлексию для вызова функций, которые линкер Xamarin.iOS может исключить в конфигурациях режима выпуска . Это можно избежать одним из двух способов.
- Первое — добавить
--linkskip System.Core
к дополнительным аргументам mtouch в параметрах сборки iOS. - Или можно задать поведение компоновщика Xamarin.iOS
Don't Link
в параметрах сборки для iOS . Этой статье объясняется больше о компоновщике Xamarin.iOS включая настройку поведения в Xamarin.iOS. (Этот подход не является идеальным, так как это может привести к отказу в магазине).
Пакеты NuGet Entity Framework Core
Чтобы создать приложения Xamarin.Forms с помощью EF Core, установите пакет для поставщиков баз данных EF Core, которые вы хотите нацелить на все проекты в решении Xamarin.Forms. В этом руководстве используется поставщик SQLite.
Следующий пакет NuGet необходим в каждом из проектов в решении Xamarin.Forms.
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
используются для работы с базовыми таблицами, представляющими блоги и записи. - Для инициации SQLite на iOS требуется
SQLitePCL.Batteries_V2.Init()
в конструкторе. - Функция
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(); }
Удалить
- Удалите все записи с каскадом до дочерних записей.
Функция
DeleteAll_Clicked
вBlogsPage.xaml.cs
удаляет все записиBlog
в базе данных SQLite и выполняет каскадное удаление всех дочерних записейBlog
Post
.using (var blogContext = new BloggingContext()) { blogContext.RemoveRange(blogContext.Blogs); await blogContext.SaveChangesAsync(); }
Дальнейшие действия
В этом руководстве вы узнали, как использовать приложение Xamarin.Forms для доступа к базе данных SQLite с помощью Entity Framework Core.