0

假設我有以下模型。使用c#mvc context更新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;} 
} 

現在我有插入modelC的控制器動作。

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而不包括(急切加載)modelA和modelB。我只需要添加外鍵關係。在SaveChanges中,它也嘗試更新modelA和modelB,但我不想更新這些。我知道EF需要知道一切,但由於大量記錄的急切加載可能會引發內存問題。

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

如果我不需要內連接modelAID modelBID。並只顯示modelC。

同樣在某些情況下,如果我將modelC返回爲JSON對象,則表示找到了循環引用,因爲它在modelB中重複modelAID一次,modelC中出現一次。我希望我能說清楚。

注:使用代碼第一種方法。

+0

加載ModelA通常使用關鍵字'virtual'創建外鍵。在你的例子中,我懷疑你必須使用:'public virtual modelA modelAID {get;組; }' – peval27

+0

如果我使用虛擬它將啓動延遲加載。我想要的是,不加載相關對象。 –

回答

0

[從內存] 您需要使用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場景的),或者您可以強制EF使用.include

+0

我在上面創建modelB時創建了modelB。它只會將我的數據庫ForeignKey列從modelAID_ID更改爲modelAID。如果我在保存更改時未包含modelAID db.modelBs.include(「modelAID」),則會嘗試創建新的modelA並說主鍵已存在於數據庫中。爲什麼我必須包括。我不需要modelB中的modelA我有modelC中的modelA。兩者與modelC有着不同的關係。 –