Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этом руководстве вы создадите приложение 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.
Читать
Вернуть все записи.
Функция
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.