2017-04-06 10 views
1

私は次のような状況があります。EF6でこの奇妙な動作がなぜ発生するのですか?

:私はその後、私はオブジェクトを移入最初のデータモデル

public partial class Parents 
{ 
    public Parents() 
    { 
     this.Childs = new HashSet<Childs>(); 
    } 

    public int IdParent { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<Childs> Childs { get; set; } 
} 

Childエンティティ

public partial class Childs 
{ 
    public int IdChild { get; set; } 
    public int IdParent { get; set; } 
    public string Description { get; set; } 

    public virtual Parents Parents { get; set; } 
} 

私のEF6データベースにParent実体を持って

Parents parent = new Parents(); 
parent.Description = "Test parent"; 

List<Childs> childList = new List<Childs>(); 

childList.Add(new Childs { Description = "Test child 1" }); 
childList.Add(new Childs { Description = "Test child 2" }); 

は今、私はこの操作を実行します。

using (CUSTOMER_Entities context = new CUSTOMER_Entities()) 
{ 
    //adding parent and childs to the context (WITHOUT ANY LINK OR FOREING KEY SET) 

    context.Parents.Add(parent); 

    context.Childs.AddRange(childList); 

    context.SaveChanges(); 

} 

私の質問は:のSaveChangesた後、私はチャイルズが正しい「IdParent」とDBに保存されている理由は?

通常私が行います

using (CUSTOMER_Entities context = new CUSTOMER_Entities()) 
{ 

    context.Parents.Add(parent); 

    foreach (var child in childList) 
    { 
     parent.Childs.Add(child); 
    } 

    context.SaveChanges(); 
} 

または

using (CUSTOMER_Entities context = new CUSTOMER_Entities()) 
{ 

    context.Parents.Add(parent); 

    foreach (var child in childList) 
    { 
     child.IdParent = parent.IdParent; 

     context.Childs.Add(child); 
    } 
} 

を正しい方法は何ですか?

答えて

1

(私が使用するつもりです実体aの特異な名前ND参照)

EFは、親と子を結ぶ理由はParentId = 0を持っており、子どもたちのすべてがボンネットの下に= 0

IdParentを持っているということです、EFは常に関係フィックスアップを実行します。これは、EFがナビゲーションプロパティ(Child.ParentおよびParent.Childrenなど)をプリミティブ主キーおよび外部キー値(Id,)と同期させようとするプロセスです。子がコンテキストに追加された後、キー値(PKとFK)が0であるため、EFは親と子を接続します。

EFがデータを挿入すると、最初に親が挿入されます。すぐにデータベースから生成されたPK値を取得し、子を保存する前に子供のIdParentプロパティに書き込みます。

アソシエーションのこの自動設定は、手動で設定することで無効にすることができます。

子を2つの親に割り当てることができないため、例外が発生する可能性があります。しかし、あなたがしている場合...

parent.Children = childList; 
context.Parents.Add(parent); 

context.Parents.Add(parent2); 

...手動で関連付けを設定して、EFは満足しています。

0

これを行うには複数の方法があります。私はEF自分自身にとって非常に新しいので、他のものよりも利点があるかどうかはわかりません。

EFは、必要に応じて手動で指定することもできますが、ほとんどのFKリレーションシップを処理する必要があります。

EX1:

Parents P = New Parent(); 
P.Childs.Add(New Childs()); 
context.Parents.Add(P); 
//Now child is part of this particular parent's collection, it should be able 
//to determine which foreign key to use automatically when you... 
context.SaveChanges(); 

EX2:

//Code here to pull parent 
Parents P = context.Parents.Find(ParentID); 
//Assign child to said parent during instantiation 
Childs C = new Childs{ Description = "Test", Parents = P}; 
context.Childs.Add(C); 
context.SaveChanges(); 

EX3:

//Use convention or annotations 
//convention naming for foreign key 
public partial class Childs 
{ 
    public int IdChild { get; set; } 
    //public int IdParent { get; set; } 
    public int ParentsID {get; set;}// <--- 
    public string Description { get; set; } 

    public virtual Parents Parents { get; set; } 
} 

例3については、以下を参照してください。https://msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx

関連する問題