Entity Framework Core 入門
このチュートリアルでは、Entity Framework Core を使用して SQLite データベースに対してデータ アクセスを実行する Xamarin.Forms アプリケーションを作成します。
チュートリアルに従うには、Windows 上の Visual Studio または Visual Studio for Mac を使用します。
アドバイス (if "Tip" refers to advice) チップ (if "Tip" refers to a gratuity) (Note: Only one of these should be selected based on the appropriate context.)
この記事の サンプルは、GitHubで確認できます。
前提 条件
次のいずれかをインストールします。
- Visual Studio 2019 バージョン 16.3 以降 、このワークロードで します。
- .NET を使用したモバイル開発
- Visual Studio for Mac
この ドキュメントでは、各プラットフォームに 詳細なインストール手順について説明します。
サンプル プロジェクトをダウンロードして実行する
このサンプル アプリケーションを実行して調べるには、GitHub でコードをダウンロードします。
ダウンロードしたら、Visual Studio または Visual Studio for Mac で EFGettingStarted.sln
ソリューション ファイルを開き、任意のプラットフォームでアプリケーションを実行します。
アプリが最初に起動すると、ローカルの SQLite データベースにブログを表す 2 つのエントリが設定されます。
のスクリーンショット
ツール バーの [ 追加] ボタンをクリックします。
新しいブログに関する情報を入力できる新しいページが表示されます。
すべての情報を入力し、ツール バー [ 保存] をクリックします。 新しいブログはアプリの SQLite データベースに保存され、一覧に表示されます。
リスト内のいずれかのブログ エントリをクリックすると、そのブログの投稿を確認できます。
のスクリーンショット
ツール バー [ の追加] をクリックします。
その後、新しいブログ投稿に関する情報を入力できるページが表示されます。
のスクリーンショット
すべての情報を入力し、ツール バーの [保存] をクリックします。
新しい投稿は、前の手順でクリックしたブログ投稿に関連付けられ、アプリの SQLite データベースに保存され、一覧に表示されます。
ブログリストページに戻ります。 ツールバー [すべての を削除]をクリックします。 その後、すべてのブログとそれに対応する投稿がアプリの SQLite データベースから削除されます。
コードを調べる
次のセクションでは、Xamarin.Forms で EF Core を使用して SQLite データベースからデータを読み取り、作成、更新、および削除するサンプル プロジェクトのコードについて説明します。
Xamarin.Forms のトピックデータを表示する とページ間を移動するについて理解していることを前提としています。
大事な
Entity Framework Core ではリフレクションを使用して、リリース モードの構成中に Xamarin.iOS リンカーが取り除く可能性がある関数を呼び出します。 これは、2 つの方法のいずれかで回避できます。
- 1 つ目は、iOS Build オプションで 追加の mtouch 引数に
--linkskip System.Core
を追加します。 - または、Xamarin.iOS リンカーの動作 を iOS Build オプションで
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 データベース内の各テーブルは、クラスでモデル化されます。 このサンプルでは、Models
フォルダーにある Blog
と Post
の 2 つのクラスを使用します。
モデル クラスは、データベース内のモデル列のプロパティのみで構成されます。
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(); }
創造する
- 新しいレコードを挿入します。
AddBlogPage.xaml.cs
のSave_Clicked
関数は、SQLite データベースに新しいBlog
オブジェクトを挿入します。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 データベースにアクセスする方法について説明しました。