Entity Framework
エンティティ状態の管理
サーチ…
備考
Entity Frameworkのエンティティは、 System.Data.Entity.EntityState列挙によって列挙されるさまざまな状態を持つことができます。これらの状態は次のとおりです。
Added
Deleted
Detached
Modified
Unchanged
Entity FrameworkはPOCOと連携します。つまり、エンティティは、独自の状態を管理するプロパティとメソッドを持たない単純なクラスです。エンティティの状態は、 ObjectStateManager
コンテキスト自体によって管理されます。
このトピックでは、エンティティの状態を設定するさまざまな方法について説明します。
状態の設定単一エンティティの追加
EntityState.Added
は、2つの全く同じ方法で設定できます。
コンテキスト内のエントリの状態を設定することによって:
context.Entry(entity).State = EntityState.Added;
それをコンテキストの
DbSet
に追加することによって:context.Entities.Add(entity);
SaveChanges
呼び出すと、エンティティがデータベースに挿入されます。それは、 このプロパティがすでに値を持っていたとしても、それがID列(自動セット、自動インクリメントプライマリキー)を持っている場合 、 SaveChanges
後、エンティティのプライマリキープロパティは新しく生成された値を含みます 。
設定状態オブジェクトグラフの追加
オブジェクトグラフ (関連するエンティティの集合)の状態を[ Added
設定することは、単一のエンティティをAdded
として設定することとは異なります( この例を参照)。
この例では、惑星とその月を保存しています:
クラスモデル
public class Planet
{
public Planet()
{
Moons = new HashSet<Moon>();
}
public int ID { get; set; }
public string Name { get; set; }
public ICollection<Moon> Moons { get; set; }
}
public class Moon
{
public int ID { get; set; }
public int PlanetID { get; set; }
public string Name { get; set; }
}
コンテキスト
public class PlanetDb : DbContext
{
public property DbSet<Planet> Planets { get; set; }
}
この文脈のインスタンスを使用して、惑星とその月を追加します。
例
var mars = new Planet { Name = "Mars" };
mars.Moons.Add(new Moon { Name = "Phobos" });
mars.Moons.Add(new Moon { Name = "Deimos" });
context.Planets.Add(mars);
Console.WriteLine(context.Entry(mars).State);
Console.WriteLine(context.Entry(mars.Moons.First()).State);
出力:
Added
Added
ここで見られるのは、 Planet
を追加することで、月の状態がAdded
設定されるということです。
エンティティの状態をAdded
に設定すると、ナビゲーションプロパティ( Planet.Moons
などの他のエンティティに「ナビゲート」するプロパティ)内のすべてのエンティティも、既にコンテキストにアタッチされていない限り、 Added
としてマークされます 。