[英]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.