簡體   English   中英

調用DataContext.SaveChanges()時,C#MVC實體框架,子ID,孫ID不必要地增加

[英]C# MVC Entity Framework, child ID, grandchild ID is unnecessarily incrementing when DataContext.SaveChanges() is called

我在C#實體框架中有3個類的簡單設計:

class Foo{ int id, string name}
class ParentFoo{ int id, Foo foo}
class GrandparentFoo{int id, ParentFoo parentFoo}

當我嘗試使用DataContext.SaveChanges()將記錄保存在GrandparentFoo中時,ParentFoo和Foo的ID會增加,這是不期望的。

function AddGrandparent(int g_id, ParentFoo pf){

 using (var dc = dcHelper_.CreateDataContext())
        {
            result = dc.GrandparentFoos.Add(new GrandparentFoo()
            {
                id = g_id,
                parentFoo = pf 
            });

            dc.SaveChanges(); }}

誰能幫我解決這個問題?

ParentFoo等未與您的上下文關聯,因此上下文會將它們視為新實體。 避免在加載實體的上下文之外傳遞實體,以避免出現此類問題。 相反,如果將ID所需的父/子數據加載到POCO視圖模型中,然后根據需要檢索引用,則可以避免未關聯實體的問題。

使用您的代碼:

void AddGrandparent(int id, ParentFoo pf)
{
  using (var dc = dcHelper_.CreateDataContext())
  {
    var parent = dc.ParentFoos.Find(pf.Id);
    dc.GrandparentFoos.Add(new GrandparentFoo
    {
      Id = id,
      ParentFoo = parent 
    });
    dc.SaveChanges(); 
  }
}

如果GrandParentFoo設置了身份,則可以取消設置ID,EF在添加到上下文中時將忽略它。 如果parent包含對祖父母的引用,那么您可能還需要在ParentFoo中設置該引用。

var grandParent = dc.GrandparentFoos.Add(new GrandparentFoo
{
  Id = id,
  ParentFoo = parent 
});
parent.GrandparentFoo = grandParent;

編輯:如果GrandParent有一個Parent的集合,並且您想創建一個Grandparent並將其關聯到一個現有的Parent:

首先,請確保將GrandParent中的Parents集合初始化為新的List / HashSet

public virtual ICollection<ParentFoo> ParentFoos {get; set;} = new List<Parent>();

然后

 using (var dc = dcHelper_.CreateDataContext())
 {
   var parent = dc.ParentFoos.Find(pf.Id);
   var grandParent = dc.GrandparentFoos.Add(new GrandparentFoo
   {
     Id = id
   });
   grandParent.ParentFoos.Add(parent);
   parent.GrandparentFoo = grandParent;
 }

給定父級,ParentFoo的子級無關緊要,並且它的關聯子級已經存在於數據中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM