0

次のモデルがあるとします。複数の外部キーデータモデルがC#mvcコンテキストを使用してEFで更新される

public class modelA 
{ 
    [Key] 
    public int ID {get; set;} 
    public string Name {get; set;} 
} 

public class modelB 
{ 
    [key] 
    public int ID {get; set;} 
    public string Name {get; set;} 
    public modelA modelAID {get; set;} 
} 

public class modelC 
{ 
    [key] 
    public int ID {get; set;} 
    public string Name {get; set;} 
    public modelA modelAID {get; set;} 
    public modelB modelBID {get; set;} 
} 

ここでモデルCを挿入するコントローラアクションがあります。

public ActionResult addModelC() 
{ 
    modelA dbModelA = db.modelAs.FirstOrDefault(); 
    modelB dbModelB = db.modelBs.FirstOrDefault(); 

    modelC newModelC = new modelC(); 
    newModelC.Name = "New Model C"; 
    newModelC.modelAID = dbModelA; 
    newModelC.modelBID = dbModelB; 

    db.modelCs.Add(newModelC); 
    db.SaveChanges(); //DbEntityValidation error on dbModelB.modelAID empty because its not included when db.modelBs query was called 
} 

私はdb.modelBs EFに熱心な負荷modelAIDいけない場合)(でsaveChangesに新しいレコードを作成しようとします。これをやめる方法は?

modelCを追加するには、モデルAとモデルBを含めることなく(熱心に読み込む)ことができます。私は外部キーの関係を追加する必要があります。ここではSaveChangesでもmodelAとmodelBを更新しようとしていますが、それらを更新したくありません。私はEFがすべてを知っている必要があることを知っていますが、

db.modelCs.include(i=>i.modelAID).include(i=>i.modelBID).ToList(); 

modelAID modelBIDを内部結合する必要はありません。モデルCのみを表示します。

モデルCをJSONオブジェクトとして返す場合、モデルBではmodelAIDを繰り返し、モデルCでは1つを繰り返すため、循環参照が見つかります。私はそれを明確にすることを望む。

注:コードを最初に使用します。 [メモリから]

+0

の外部キーを作成することができます。あなたの例では、私はあなたが使用する必要が疑わしい: 'public virtual modelA modelAID {get;セット; } ' – peval27

+0

仮想を使用すると、遅延ロードが開始されます。私が望むのは、関連するオブジェクトを読み込まないことです。 –

答えて

0

あなたはmodelCを作成する際にこれらを一緒

// Foreign key 
public int modelAID { get; set; } 

// Navigation properties 
public virtual ModelA ModelA { get; set; } 

https://msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx#Anchor_2だから、あなただけmodelAID = modelA.Idとの関係を割り当てる必要がありますが、リンクできるようにFK規則を使用する必要があります設定されています。 modelCをロードするときに、ModelA(N + 1シナリオに注意)を動的にロードさせるか、EFにModelAを強制的にロードさせて.include

+0

上記のようにmodelBを作成しました。私のデータベースForeignKey列は、modelAID_IDからmodelAIDに変更されます。それでも、変更を保存するときにmodelAID db.modelBs.include( "modelAID")が含まれていないと、新しいmodelAを作成しようとしていて、プライマリキーがすでにデータベースに存在しています。なぜ私は含める必要があります。モデルBではmodelAは必要ありませんmodelCではmodelAがあります。どちらもmodelCとは異なる関係にあります。 –

関連する問題