假设我有以下模型。
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 中加载 modelAID,EF 将尝试在 saveChanges() 上创建新记录。如何阻止这种情况?
如何在不包括(预先加载)模型 A 和模型 B 的情况下添加modelC
。我只需要添加外键关系。在SaveChanges中,它还尝试更新模型A和模型B,但我不想更新它们。我知道EF需要知道一切,但由于大记录急切加载可能会引发内存问题。
db.modelCs.include(i=>i.modelAID).include(i=>i.modelBID).ToList();
如果我不需要内部联接 modelAID modelBID,并且只显示 modelC。
此外,在某些情况下,如果我将 modelC 作为 JSON 对象返回,它会说找到循环引用,因为它在模型 B 中有一个重复的 modelAID,在模型 C 中有一个。我希望我说清楚。
注意:使用代码优先方法。
[从内存]您需要使用 FK 约定来允许您将它们链接在一起
https://msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx#Anchor_2
// Foreign key
public int modelAID { get; set; }
// Navigation properties
public virtual ModelA ModelA { get; set; }
所以在创建modelC
时,你只需要分配modelAID = modelA.Id
并设置关系。然后,在加载 modelC
时,可以让 EF 动态加载ModelA
(当心 N+1 方案),也可以使用 .include
强制 EF 加载 ModelA