EF Core と Xamarin の概要
このチュートリアルでは、Entity Framework Core を使用して SQLite データベースに対してデータ アクセスを実行する Xamarin.Forms アプリケーションを作成します。
Windows 上の Visual Studio または Visual Studio for Mac を使用すると、このチュートリアルを実行できます。
ヒント
この記事のサンプルは GitHub で確認できます。
前提条件
次のいずれかをインストールします。
- 次のワークロードでは、Visual Studio 2019 バージョン 16.3 以降:
- .NET によるモバイル開発
- Visual Studio for Mac
このドキュメントでは、各プラットフォームの詳細なインストール手順について説明します。
サンプル プロジェクトのダウンロードと実行
このサンプル アプリケーションを実行して調べるには、GitHub からコードをダウンロードします。
ダウンロードしたら、ソリューション ファイル EFGettingStarted.sln
を Visual Studio または Visual Studio for Mac で開き、選択したプラットフォーム上でアプリケーションを実行します。
アプリを初めて起動すると、ブログを表す 2 つのエントリがローカルの SQLite データベースに読み込まれます。
ツール バーの [追加] ボタンをクリックします。
新しいブログに関する情報を入力できる新しいページが表示されます。
すべての情報を入力したら、ツール バーの [保存] をクリックします。 新しいブログがアプリの SQLite データベースに保存され、リストに表示されます。
リスト内のブログ エントリのいずれかをクリックすると、そのブログのすべての投稿が表示されます。
ツール バーの [追加] をクリックします。
新しいブログ記事に関する情報を入力できるページが表示されます。
すべての情報を入力したら、ツール バーの [保存] をクリックします。
新しい投稿は、前の手順でクリックしたブログ記事に関連付けられ、アプリの SQLite データベースに保存され、リストに表示されます。
ブログ リスト ページに戻ります。 ツール バーの [すべて削除] をクリックします。 すべてのブログとそれに対応する投稿は、アプリの SQLite データベースから削除されます。
コードを調べる
次のセクションでは、Xamarin.Forms で EF Core を使用して SQLite データベースからデータの読み取り、作成、更新、削除を行うサンプル プロジェクトのコードについて説明します。
データの表示およびページ間の移動に関する Xamarin.Forms トピックを理解していることを前提として説明します。
重要
Entity Framework Core ではリフレクションを使用して、リリース モード構成中は Xamarin.iOS リンカーによって削除できる関数が呼び出されます。 これは、次の 2 つの方法のいずれかで回避できます。
- 1 つ目は、iOS ビルド オプションの追加 mtouch 引数に
--linkskip System.Core
を追加することです。 - または、iOS ビルド オプションで Xamarin.iOS の [リンカーの動作] を
Don't Link
に設定します。 こちらの記事に、Xamarin.iOS リンカーについての詳細が記載されています (Xamarin.iOS の動作を設定する方法など)。 (この方法は、ストアからの拒否が発生する可能性があるため、理想的ではありません)。
Entity Framework Core NuGet パッケージ
EF Core を使用して Xamarin.Forms アプリを作成するには、対象とする EF Core データベース プロバイダー用のパッケージを、Xamarin.Forms ソリューションのすべてのプロジェクトにインストールします。 このチュートリアルでは、SQLite プロバイダーを使用します。
Xamarin.Forms ソリューションの各プロジェクトには、次の NuGet パッケージが必要です。
Microsoft.EntityFrameworkCore.Sqlite
モデル クラス。
EF Core 経由でアクセスされる SQLite データベースの各テーブルは、クラスでモデル化されます。 このサンプルでは、Blog
と Post
という 2 つのクラスが使用されています。これらは 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
の各プロパティは、Post
のインスタンスの親Blog
オブジェクトに関連付けられています。
データ コンテキスト
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
を持つこのクラスの両プロパティは、ブログと投稿を表す基となるテーブルを操作するために使用されます。 - iOS 上で SQLite を開始するには、コンストラクターに
SQLitePCL.Batteries_V2.Init()
が必要です。 OnConfiguring
関数を使用して、物理デバイス上に SQLite データベースの場所を設定します。
作成、読み取り、更新、および削除
EF Core を使用して SQLite にアクセスするアプリのインスタンスの一部を次に示します。
既読
- すべてのレコードが返されます。
BlogsPage.xaml.cs
のOnAppearing
関数を使用すると、すべてのBlog
レコードが返され、それらがList
変数に格納されます。
using (var blogContext = new BloggingContext())
{
var theBlogs = blogContext.Blogs.ToList();
}
- 特定のレコードが返されます。
PostsPage.xaml.cs
のOnAppearing
関数を使用すると、特定のBlogId
を含むPost
レコードが返されます。
using (var blogContext = new BloggingContext())
{
var postList = blogContext.Posts
.Where(p => p.BlogId == BlogId)
.ToList();
}
create
- 新しいレコードが挿入されます。
AddBlogPage.xaml.cs
のSave_Clicked
関数を使用すると、新しいBlog
オブジェクトが SQLite データベースに挿入されます。
var blog = new Blog { Url = blogUrl.Text };
using (var blogContext = new BloggingContext())
{
blogContext.Add(blog);
await blogContext.SaveChangesAsync();
}
更新
- 既存のレコードが更新されます。
AddPostPage.xaml.cs
のSave_Clicked
関数を使用すると、既存の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();
}
削除
- 子レコードへのカスケードを含むすべてのレコードが削除されます。
BlogsPage.xaml.cs
のDeleteAll_Clicked
関数を使用すると、SQLite データベース内のすべてのBlog
レコードが削除され、その削除がすべてのBlog
の子Post
レコードにカスケードされます。
using (var blogContext = new BloggingContext())
{
blogContext.RemoveRange(blogContext.Blogs);
await blogContext.SaveChangesAsync();
}
次のステップ
この概要では、Xamarin.Forms アプリケーションを使用し、Entity Framework Core を使用して SQLite データベースにアクセスする方法について学習しました。
Xamarin 開発者にお勧めのその他の Entity Framework Core トピック:
DbContext
の構成- LINQ クエリ式について参照してください
- required や maximum length などを指定し、モデルを構成します
.NET