我正在使用實體框架,它使用的實體是數據庫表示和業務對象。
所以這意味着一些被操縱的實體應該總是與上下文保持分離。阻止實體框架自動附加實體
我設法讀取和寫入數據庫中的數據,但我有一個小問題時更新:
我有一個表「股票」鏈接到一個表「倉庫」。
目前的流程是這樣的一個(簡化,但精神依然存在,還有更多的領域):
- 創建一個新的對象股票及其字段都充滿了一些值(日期...)
- 當前倉庫(從數據庫提取整個請求的對象)關聯到庫存對象
- 該對象發送到DAL方法,該方法的工作是保存它。
- DAL方法檢查庫存項是否已經存在於數據庫中的某一天(同一日期,倉庫和相同類型)
- 如果存在,該方法將更新來自所拉取對象的卷並保存更改。
- 否則,插入新的Stock對象。
這裏的問題是,當我創建新的股票對象,並將其關聯到倉庫,對象EntityState被自動設置爲「補充」。所以當我執行SaveChanges()並且股票已經存在時,這條線被更新並且新的股票線被添加...
我想要的是保持新的股票對象獨立直到我自己附加它。我不希望它自動發生。
我發現的唯一解決方案是在保存之前從上下文中分離新對象,如果對象已經存在。
我也可以分離()倉庫對象,但這不是一個令人滿意的解決方案,我認爲在真實情況下有更多的項目關聯,我不確定這是一個好主意玩Attach()和Detach()在他們。
在這種情況下,直到我自己將它「添加」到上下文中,該對象只是一個「傳輸」對象,我希望它不在上下文中。
關於如何讓stock對象分離的任何想法?
代碼(也可能是有點不正確,我的記憶寫的):
Stock stk = new Stock();
stk.Date = DateTime.Now;
stk.Volume = 100; //so far stk is "Detached" and that's cool.
stk.Warehouse = CurrentWarehouse; //stk become "Added" and that's less cool.
DAL.Stock.Instance.Save(stk);
在保存():
var existing = (from s in Context.CurrentContext.Stock
where s.Warehouse.WarehouseId == stk.Warehouse.WarehouseId && s.Date == stk.Date && s.Type == 2
select s).FirstOfDefault();
if(existing != null)
{
existing.Volume = stk.Volume;
Context.CurrentContext.Detach(stk); //I find it a stupid workaround !!!!!!
}
else
{
Context.CurrentContext.AddToStock(stk); //what I would want to do.
}
Context.CurrentContext.SaveChanges()
對我也一樣!你弄明白了嗎? – 2012-06-08 03:40:15
可悲的是。我不記得我使用的解決方法。我想我開始使用POCO對象。 – 2012-06-09 10:55:11