次の方法で共有


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で確認できます。

前提 条件

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

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

サンプル プロジェクトをダウンロードして実行する

このサンプル アプリケーションを実行して調べるには、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 フォルダーにある BlogPost の 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 プロパティは、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();
      }
      

創造する

  • 新しいレコードを挿入します。
    • AddBlogPage.xaml.csSave_Clicked 関数は、SQLite データベースに新しい Blog オブジェクトを挿入します。

      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 レコードを削除し、その削除をすべての BlogPost レコードにカスケードします。

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

次の手順

この概要では、Xamarin.Forms アプリケーションを使用して Entity Framework Core を使用して SQLite データベースにアクセスする方法について説明しました。