Поделиться через


Начало работы с Entity Framework Core

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

Руководство можно выполнить с помощью Visual Studio в Windows или 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.

Читать

  • Вернуть все записи.

    • Функция OnAppearingBlogsPage.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_ClickedAddBlogPage.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 и выполняет каскадное удаление всех дочерних записей BlogPost.

      using (var blogContext = new BloggingContext())
      {
          blogContext.RemoveRange(blogContext.Blogs);
      
          await blogContext.SaveChangesAsync();
      }
      

Дальнейшие действия

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