このガイドでは、MongoDB Entity Framework コア プロバイダーを使用するようにアプリケーションを構成する方法を学習します。 新しいプロジェクトを設定し、TF コア プロバイダーをインストールする方法については、 クイック スタートを参照してください。
POCO を作成
エンティティのモデルとして使用するには、 Plain Old CLR/Classオブジェクト、または POCO を作成します。POCO は、フレームワーク固有の基本クラスやインターフェースから機能を継承しない単純なクラスオブジェクトです。
次のコード例は、カスタマーを表す POCO を作成する方法を示しています。
public class Customer { public ObjectId Id { get; set; } public string Name { get; set; } = null!; public string Order { get; set; } = null!; }
Tip
POCO の詳細については、.NET/C# ドライバーのドキュメントのPOCO ガイドを参照してください。
DB コンテキスト クラスの作成
Entity Framework コアの使用を開始するには、DBContext から派生したコンテキストクラスを作成します。DbContext の派生クラスのインスタンスはデータベースセッションを表し、エンティティのインスタンスのクエリと保存に使用されます。
DBContextクラスは、そのコンテキストを使用中に操作できるエンティティを指定するDBSetプロパティを公開します。
次の例では、 DBContext派生クラスのインスタンスを作成し、 CustomerオブジェクトをDBSetプロパティとして指定しています。
public class MyDbContext : DbContext { public DbSet<Customer> Customers { get; init; } = null!; public MyDbContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Customer>().ToCollection("customers"); } }
前のコード例はOnModelCreating()メソッドをオーバーライドします。 OnModelCreating()メソッドをオーバーライドすると、モデルとそのプロパティの構成の詳細を指定できます。 この例では、 ToCollection()メソッドを使用して、アプリケーション内のCustomerエンティティが MongoDB のcustomersコレクションにマップされることを指定します。
MongoDB の使用
DBContextクラスを作成したら、 DbContextOptionsBuilderオブジェクトを構築し、そのUseMongoDB()メソッドを呼び出します。 このメソッドでは、 MongoClientインスタンスと、操作するコレクションを保存するデータベースの名前の 2 つのパラメータを取ります。
UseMongoDB()メソッドはDbContextOptionsオブジェクトを返します。 このオブジェクトのOptionsプロパティをDBContextクラスのコンストラクターに渡します。
次の例は、この方法でDBContextオブジェクトを構築する方法を示しています。
var mongoClient = new MongoClient("<connection string>"); var dbContextOptions = new DbContextOptionsBuilder<MyDbContext>().UseMongoDB(mongoClient, "<database name>"); var db = new MyDbContext(dbContextOptions.Options);
Tip
MongoClient の作成
LF Core プロバイダーを使用する場合、MongoDB .NET/C# ドライバーからメソッドを呼び出すことができます。 前の例では、.NET/C# ドライバーのMongoClient()メソッドを使用して、MongoDB インスタンスに接続する MongoDB クライアントを作成しています。
MongoDB .NET/C# ドライバーを使用して MongoDB に接続する方法の詳細については、.NET/C# ドライバーのドキュメントの「接続ガイド」を参照してください。
MongoClient と DbContext の有効期間
MongoClient オブジェクトと DbContext オブジェクトの有効期間と構成は、メモリ使用量と接続プールの効率に直接影響します。
MongoClientを単一ドキュメントとして登録し、すべてのDbContext 登録で 1 つのインスタンスを共有します。各MongoClient オブジェクトは独自の 内部接続プールを管理するため、各 スコープごとに個別のインスタンスを作成すると接続が消費され、レイテンシが増加します。詳細については、DbContext .NET/ C#ドライバーのドキュメントの「 MongoClient ディストリビューションの管理 」を参照してください。
DbContextをスコープ指定サービスとして登録し、各リクエストで新しい変更トグルを使用するようにします。単一のDbContext は、すべてのリクエストにわたって追跡されるエンティティの状態を蓄積するため、古いデータ、メモリが増加するにつれて、変更検出は遅くなります。トッラーが大きくなるにつれて、変更検出は遅くなります。詳細については、 Microsoft Entity Framework コア ドキュメントの「 ASP .NET Core 向けの依存関係インジェクションの DbContext 」を参照してください。
例
次のコード例は、依存関係インジェクションを使用してサービスを登録し、FS コア プロバイダーを構成し、データベースにドキュメントを挿入する方法を示しています。
var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton<IMongoClient>( new MongoClient("<connection string>")); serviceCollection.AddDbContext<MyDbContext>((serviceProvider, options) => { var mongoClient = serviceProvider.GetRequiredService<IMongoClient>(); options.UseMongoDB(mongoClient, "<database name>"); }); var app = serviceCollection.BuildServiceProvider(); using (var scope = app.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService<MyDbContext>(); // Add a new customer and save it to the database db.Customers.Add(new Customer() { Name = "John Doe", Order = "1 Green Tea" }); db.SaveChanges(); }