web-dev-qa-db-ja.com

ID列を使用したEFコードの最初の親子挿入

次のモデルがあります。

class Parent
{
    int ParentId (identity column) { get; set; }
    string ParentName { get; set; }
    virtual ICollection<Child> Children { get; set; }
}

class Child
{
    int ChildId (identity column) { get; set; }
    string ChildName { get; set; }
    int ParentID { get ; set; } //foreign key to Parent(ParentID)
}

単一のトランザクションで親と子にいくつかの行を挿入するにはどうすればよいですか?基本的に、親で生成されたIDを取得し(たとえば、親に行を挿入します)、その値で子行を挿入しますか? Code Firstを使用してこれをどのように実現できますか?

26
user396491

Parent行を挿入するために、ChildのIdがどのような値を取得するかについて心配する必要はありません。これで十分です:

_var parent = new Parent
{
    // fill other properties

    Children = new List<Child>()
}

parent.Children.add(new Child { /*fill values */);

dbContext.Parents.Add(parent); // whatever your context is named
dbContext.SaveChanges();
_

レコードの場合、SaveChanges()を呼び出した後にIDが割り当てられるため、reallyChildエンティティは常にSaveChanges()を2回呼び出すことができます。

繰り返しますが、これは必要ありません。

ちなみに、外部キープロパティをChildからParentまでをナビゲーションプロパティにすることをお勧めします。したがって、Childクラスは次のようになります。

_class Child
{
    public int ChildId { get; set; } // identity column
    public string ChildName { get; set; }
    public virtual Parent Parent { get ; set; } //foreign key to Parent
}
_

そうすれば、データベースから明示的に取得する必要なく、常に子の親に直接アクセスできます(遅延ロードされます)。

41
Sergi Papaseit

これを行う方法の例については、新しいEF Code First MVCチュートリアルシリーズを参照してください。シリーズの6番目のものはこの例です。 10のシリーズの最初の1つはここにあります: http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net -mvc-application

2
tdykstra