EF Core と Xamarin の概要

このチュートリアルでは、Entity Framework Core を使用して SQLite データベースに対してデータ アクセスを実行する Xamarin.Forms アプリケーションを作成します。

Windows 上の Visual Studio または Visual Studio for Mac を使用すると、このチュートリアルを実行できます。

ヒント

この記事のサンプルは GitHub で確認できます。

前提条件

次のいずれかをインストールします。

このドキュメントでは、各プラットフォームの詳細なインストール手順について説明します。

サンプル プロジェクトのダウンロードと実行

このサンプル アプリケーションを実行して調べるには、GitHub からコードをダウンロードします。

ダウンロードしたら、ソリューション ファイル EFGettingStarted.sln を Visual Studio または Visual Studio for Mac で開き、選択したプラットフォーム上でアプリケーションを実行します。

アプリを初めて起動すると、ブログを表す 2 つのエントリがローカルの SQLite データベースに読み込まれます。

Screenshot of all blogs list page

ツール バーの [追加] ボタンをクリックします。

新しいブログに関する情報を入力できる新しいページが表示されます。

Screenshot of new blog edit page

すべての情報を入力したら、ツール バーの [保存] をクリックします。 新しいブログがアプリの SQLite データベースに保存され、リストに表示されます。

リスト内のブログ エントリのいずれかをクリックすると、そのブログのすべての投稿が表示されます。

Screenshot of blog posts list page

ツール バーの [追加] をクリックします。

新しいブログ記事に関する情報を入力できるページが表示されます。

Screenshot of add new post page

すべての情報を入力したら、ツール バーの [保存] をクリックします。

新しい投稿は、前の手順でクリックしたブログ記事に関連付けられ、アプリの SQLite データベースに保存され、リストに表示されます。

ブログ リスト ページに戻ります。 ツール バーの [すべて削除] をクリックします。 すべてのブログとそれに対応する投稿は、アプリの SQLite データベースから削除されます。

Screenshot of app with all blogs deleted

コードを調べる

次のセクションでは、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 データベースの各テーブルは、クラスでモデル化されます。 このサンプルでは、BlogPost という 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 プロパティには、BlogPost 間の親子関係を定義します。

  • 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.csOnAppearing 関数を使用すると、すべての Blog レコードが返され、それらが List 変数に格納されます。
using (var blogContext = new BloggingContext())
{
    var theBlogs = blogContext.Blogs.ToList();
}
  • 特定のレコードが返されます。
    • PostsPage.xaml.csOnAppearing 関数を使用すると、特定の BlogId を含む Post レコードが返されます。
using (var blogContext = new BloggingContext())
{
    var postList = blogContext.Posts
        .Where(p => p.BlogId == BlogId)
        .ToList();
}

create

  • 新しいレコードが挿入されます。
    • AddBlogPage.xaml.csSave_Clicked 関数を使用すると、新しい Blog オブジェクトが SQLite データベースに挿入されます。
var blog = new Blog { Url = blogUrl.Text };

using (var blogContext = new BloggingContext())
{
    blogContext.Add(blog);

    await blogContext.SaveChangesAsync();
}

更新

  • 既存のレコードが更新されます。
    • AddPostPage.xaml.csSave_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.csDeleteAll_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 トピック: