次のモデルがあるとします。複数の外部キーデータモデルが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つを繰り返すため、循環参照が見つかります。私はそれを明確にすることを望む。
注:コードを最初に使用します。 [メモリから]
の外部キーを作成することができます。あなたの例では、私はあなたが使用する必要が疑わしい: 'public virtual modelA modelAID {get;セット; } ' – peval27
仮想を使用すると、遅延ロードが開始されます。私が望むのは、関連するオブジェクトを読み込まないことです。 –