このガイドでは、MongoDB Entity Framework コア プロバイダーを使用するようにアプリケーションを構成する方法を学習します。 新しいプロジェクトを設定し、F Core プロバイダーをインストールする方法については、クイック スタート を参照してください。
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 登録で単一インスタンスを共有します。各 MongoClient オブジェクトは独自の内部接続プールを管理するため、各 DbContext スコープに別々のインスタンスを作成すると、接続が無駄になり、レイテンシが増加します。詳細については、.NET/C# ドライバードキュメントの「MongoClient Disposables の管理」を参照してください。
リクエストごとに新しい変更トラッカーを使用するよう、DbContextをスコープ別サービスとして登録します。シングルトン DbContext は、すべてのリクエストでトラックされたエンティティの状態を累積します。これにより、トラッカーが大きくなるにつれて、古いデータ、メモリの増加、および変更検出の低下が発生します。詳細については、Microsoft Entity Framework Core ドキュメントの「ASP.NET Core の依存性インジェクションにおける DbContext」を参照してください。
例
次のコード例は、依存性インジェクションを使用してサービスを登録し、EF Core プロバイダー を構成し、ドキュメントをデータベースに挿入する方法を示しています。
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>"); }); using 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(); }