我正在使用實體框架將數據保存在N層Wpf應用程序中。我的dbcontext在所有存儲庫之間共享,並且永遠不會丟棄。當我堅持數據時,我將一個對象標記爲已修改,並嘗試保存更改。如果在持久化對象時出現錯誤,則對象仍被標記爲已修改,並且如果用戶中止當前操作,則在保存另一個對象時他將得到相同的錯誤。使用單個dbcontext時發生異常後恢復
我已經在我的DbContext覆蓋的SaveChanges,如果任何錯誤accurs我接受所有的變化(見下面的代碼)解決了這個。所以如果一個錯誤產生了對象,並且所有對象都被標記爲未改變,即使他們沒有持續。
這感覺不對...... 有誰這個解決方案同意嗎? 另一個解決方案是在我的存儲庫中的每個方法中新建dbcontext並立即處理它們。這將使我的存儲庫更加複雜和「noicy」,我也將失去延遲加載數據的能力... 有沒有人對我有不同的解決方案?
//In my repositories
public void UpdateObject(Object object)
{
dbContext.Entry(object).State = EntityState.Modified;
dbContext.SaveChanges();
}
//In my dbcontext class
private ObjectContext ObjectContext()
{
return (this as IObjectContextAdapter).ObjectContext;
}
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (Exception)
{
ObjectContext().AcceptAllChanges();
throw;
}
}
思爲您answear :) 我曾想過你的解決方案,對我來說不能很好地工作。我正在使用TDD和依賴注入。 回購是通過構造函數注入在我的業務邏輯中發送的。有了你的解決方案,我將不得不爲dbcontext建立一個工廠,併爲每個存儲庫建立一個工廠。 這感覺就像過分複雜的業務邏輯和業務邏輯與事關他們...... – Jakob 2013-04-29 09:32:29
在上面的業務邏輯中,dbcontext和存儲庫都可以通過構造函數注入。就像我在回答中提到的,這只是一個簡單的例子。如果您使用關鍵字(如dbcontext作用域生存期)對Google進行了一些研究,則會發現大多數ppl建議使用短期上下文。根據我自己的經驗,我們發現了一個人忘記處理上下文的錯誤,並且它在Web服務上引起了50ms的查詢,需要3.2分鐘才能執行。 – failedprogramming 2013-04-30 22:00:52