多个外键数据模型使用 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 中加载 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

相关内容

最新更新