Начало работы с EF Core и Xamarin

В этом руководстве вы создадите приложение Xamarin.Forms, которое осуществляет доступ к базе данных SQLite с помощью Entity Framework Core.

Инструкции из этого руководства можно выполнять с помощью Visual Studio в Windows или Visual Studio для Mac.

Совет

Вы можете скачать используемый в этой статье пример из репозитория GitHub.

Необходимые компоненты

Установите одно из следующих приложений:

В этой документации содержатся подробные пошаговые инструкции по установке для каждой платформы.

Скачивание и запуск примера проекта

Чтобы запустить и изучить этот пример приложения, скачайте код на сайте GitHub.

После скачивания откройте файл решения EFGettingStarted.sln в Visual Studio или Visual Studio для Mac и запустите приложение на выбранной платформе.

При первом запуске приложения локальная база данных SQLite будет заполнена двумя записями, представляющими блоги.

Screenshot of all blogs list page

На панели инструментов нажмите кнопку Add (Добавить).

Появится новая страница, на которой можно ввести сведения о новом блоге.

Screenshot of new blog edit page

Введите все сведения и на панели инструментов нажмите кнопку Save (Сохранить). Новый блог сохранится в базе данных SQLite приложения и появится в списке.

Вы можете щелкнуть одну из записей блога в списке и просмотреть все записи в этом блоге.

Screenshot of blog posts list page

На панели инструментов нажмите кнопку Add (Добавить).

Появится страница, на которой можно ввести сведения о новой записи блога.

Screenshot of add new post page

Введите все сведения и на панели инструментов нажмите кнопку Save (Сохранить).

Новая запись будет связана с записью блога, которую вы выбрали на предыдущем шаге, сохранится в базе данных SQLite приложения и появится в списке.

Вернитесь на страницу со списком блогов. На панели инструментов нажмите кнопку Delete All (Удалить все). Все блоги и соответствующие записи будут удалены из базы данных SQLite приложения.

Screenshot of app with all blogs deleted

Обзор кода

В следующих разделах последовательно разбирается код из образца проекта, который считывает, создает, обновляет и удаляет данные в базе данных 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: