簡體   English   中英

當我從未將實體添加到上下文時,實體框架錯誤地保存了實體

[英]Entity Framework incorrectly saving an entity when I never added it to the Context

我在.NET 4.0中使用Entity Framework。 我有一個Subscription實體,它有許多CFile實體。 我創建了一個新的CFile實體,但實際上從未在其上調用AddObject 稍后我嘗試保存與它相關的Subscription實體,EF嘗試保存CFile實例,這是我從未想過的!

簡化代碼:

var subscription = new Subscription();
Context.Subscription.AddObject(subscription);
Context.SaveChanges();

var cfile = new CFile() { Subscription = subscription };
if (SomeChecksPass(cfile))
{
    Context.CFiles.AddObject(cfile);
}
else
{
    // No AddObject!
}

subscription.SomeProperty = "changed";
Context.SaveChanges(); // Saves cfile as well, even if I don't want to!

我理解為什么會這樣,但我怎么能這樣做呢? 這會產生一個相當微妙和模糊的錯誤(真正的代碼顯然要復雜得多)。 我希望它只保存我顯式傳遞給AddObject實體。

我也知道一個解決方法:在我不想保存的實體上調用Detach 但是,這不是一個好的解決方法,因為我必須確保在沒有保存cfile每個可能的代碼路徑中調用Detach(並且在某些代碼路徑中保存它),因此必須在做出決定后調用它,但在保存任何其他東西之前。 這非常脆弱,我真的不想依賴它。

編輯:創建cfile是因為我確實想在大多數時間保存它,但是如果某些驗證失敗或發生了一些錯誤,那么我就不會。 不過,我仍想保留對subscription對象的一些更改。

嘗試在你的EDMX中暴露外鍵(如果還沒有),並做這樣的事情: -

var cfile = new CFile() { SubscriptionId = subscription.Id };

這應該足以防止形成對象圖。

您可能需要在創建訂閱對象后調用Refresh(取決於生成ID的方式 - 大多數將在SaveChanges()時自動更新)。

您不直接控制要在Entity Framework中保存的實體,它會保存它認為應該保留的內容,它可以與關聯的對象圖一起使用。 您可以使用ObjectStateManager在ObjectContext.SaveChanges覆蓋中放置一些邏輯,但這非常難看。

如果您需要更多地控制要保存的內容以及何時保存,可能最好使用其他模式,如Repository | ActiveRecord,您可以更好地控制單獨的實體。 或者你經常會發現自己處於你所描述的境地。

使用時我遇到了同樣的問題:

List<Ey> eys = dc.Context.Ey.ToList();
eys = eys .Where(h => h.Employee == myEmployee).ToList();
Ey esh;
for (int k = 1; k < 5; k++)
{
EmployeeSkillHistory duplicate = histories.Where(h => h.Sl == esh.Sl).FirstOrDefault();
   if (duplicate == null)
      { dc.Context.Ey.AddObject(esh); } else { dc.Context.Ey.DeleteObject(esh); }
dc.Context.SaveChanges();
}

使用前

else { dc.Context.Ey.DeleteObject(esh); }

重復項保存在我的數據庫中

暫無
暫無

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

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