MongoDB へのデータの書込み (write)
項目一覧
Overview
Entity Framework コアを使用すると、データベースコマンドを明示的に実行せずにアプリケーション内のデータを操作できます。 SaveChanges()
またはSaveChangesAsync()
メソッドを使用して、アプリケーション内でデータを挿入、更新、または削除し、それらの変更を MongoDB に保持できます。
SaveChanges()
メソッドまたはSaveChangesAsync()
メソッドを呼び出すと、FS コア プロバイダーはデータに加えられた変更を自動的に検出し、MongoDB Query API を使用してデータベースをアップデートするために必要なコマンドを実行します。
このガイドでは、FS コア プロバイダーを使用するように構成されたアプリケーションで一般的な書込み操作を実行する方法の例を確認できます。
Tip
FS コア プロバイダーを使用するようにアプリケーションを構成する方法については、「 FS コアの構成 」を参照してください。
トランザクション書込み (write) 操作
SaveChanges()
メソッドとSaveChangesAsync()
メソッドはデフォルトでトランザクションです。 つまり、操作中にエラーが発生した場合、プロバイダーはデータベースに加えられたすべての変更をロールバックします。 このため、アプリケーションは、レプリカセットなど、トランザクションが可能な MongoDB サーバーの配置に接続する必要があります。
アプリケーションの設定時にDbContext
サブクラスでAutoTransactionBehavior
プロパティをAutoTransaction.Never
に設定することで、 SaveChanges()
メソッドとSaveChangesAsync()
メソッドで自動トランザクションを無効にできます。 ただし、この機能を無効にすることは推奨されません。 指定すると、保存操作中に同時実行の変更や操作が失敗し、データベースが非整合性のある状態のままになります。
次の例は、SaveChanges()
メソッドとSaveChangesAsync()
メソッドで自動トランザクションを無効にする方法を示しています。
dbContext.Database.AutoTransactionBehavior = AutoTransactionBehavior.Never;
警告
自動トランザクションを無効にすると、データの不整合が発生する可能性があります。 この機能を無効にしないことをお勧めします。
Insert
Add()
メソッドを使用して 1 つのエンティティをコレクションに挿入することも、 AddRange()
メソッドを使用して複数のエンティティを一度に挿入することもできます。
1 つのエンティティを挿入
Add()
メソッドは、変更対象のDbSet
インスタンスで指定したタイプと同じタイプの 1 つのエンティティを受け入れます。
次のコードでは、Add()
Planet
メソッドを使用して、 と呼ばれる新しい オブジェクトをDbSet
Planets
に追加します。次に、 SaveChanges()
メソッドを呼び出して、そのエンティティを MongoDB コレクションに挿入します。
db.Planets.Add(new Planet() { name = "Pluto", hasRings = false, orderFromSun = 9 }); db.SaveChanges();
複数のエンティティの挿入
AddRange()
メソッドは、 DbSet
に追加するエンティティの配列を受け入れます。
AddRange()
次のコードでは、Planet
メソッドを使用して、DbSet
と呼ばれる オブジェクトの配列をPlanets
に追加します。次に、 SaveChanges()
メソッドを呼び出して、それらのエンティティを MongoDB コレクションに挿入します。
var planets = new[] { new Planet() { _id = ObjectId.GenerateNewId(), name = "Pluto", hasRings = false, orderFromSun = 9 }, new Planet() { _id = ObjectId.GenerateNewId(), name = "Scadrial", hasRings = false, orderFromSun = 10 } }; db.Planets.AddRange(planets); db.SaveChanges();
Update
エンティティを更新するには、まず更新するエンティティを取得します。 次に、そのエンティティに変更を加えます。 プロバイダーは、プロパティの設定や、リスト値を持つフィールドからの項目の追加と削除など、エンティティに加えられた変更を追跡します。 MongoDB への更新を保存するには、 SaveChanges()
メソッドを呼び出します。 F Core プロバイダーは、アップデートされたエンティティを変更前のエンティティのスナップショットと比較し、MongoDB Query API を使用して コレクションを自動的にアップデートします。
次のコードは、 name
の値が"Mercury"
であるエンティティを検索し、 name
フィールドをアップデートします。 次に、コードはSaveChanges()
メソッドを呼び出して、その変更をコレクションに永続化します。
var planet = db.Planets.FirstOrDefault(p => p.name == "Mercury"); planet.name = "Mercury the first planet"; db.SaveChanges();
削除
コレクションから 1 つのエンティティを削除するにはRemove()
メソッドを、複数のエンティティを一度に削除するにはRemoveRange()
メソッドを使用します。
1 つのエンティティを削除
Remove()
メソッドは、変更対象のDbSet
インスタンスで指定したタイプと同じタイプの 1 つのエンティティを受け入れます。
次のコードは、 name
値が"Pluto"
であるPlanet
エンティティを削除します。 次に、 SaveChanges()
メソッドを呼び出して、そのエンティティは MongoDB コレクションから削除されます。
var planet = db.Planets.FirstOrDefault(p => p.name == "Pluto"); db.Planets.Remove(planet); db.SaveChanges();
複数のエンティティの削除
RemoveRange()
メソッドは、 DbSet
から削除するエンティティの配列を受け入れます。
次のコードでは、2 つのPlanet
エンティティを検索し、配列に追加します。 次に、 RemoveRange()
メソッドを使用してDbSet
から両方のエンティティを削除します。 最後に、 SaveChanges()
メソッドを使用して、それらのエンティティを MongoDB コレクションから削除します。
var pluto = db.Planets.FirstOrDefault(p => p.name == "Pluto"); var scadrial = db.Planets.FirstOrDefault(p => p.name == "Scadrial"); var planets = new[] { pluto, scadrial }; db.Planets.RemoveRange(planets); db.SaveChanges();
詳細情報
このガイドで説明するメソッドの詳細については、次の .NET API ドキュメントへのリンクを参照してください。