2009-11-20 78 views
8

我正在使用實體框架,它使用的實體是數據庫表示和業務對象。
所以這意味着一些被操縱的實體應該總是與上下文保持分離。阻止實體框架自動附加實體

我設法讀取和寫入數據庫中的數據,但我有一個小問題時更新:
我有一個表「股票」鏈接到一個表「倉庫」。

目前的流程是這樣的一個(簡化,但精神依然存在,還有更多的領域):

  • 創建一個新的對象股票及其字段都充滿了一些值(日期...)
  • 當前倉庫(從數據庫提取整個請求的對象)關聯到庫存對象
  • 該對象發送到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() 
+0

對我也一樣!你弄明白了嗎? – 2012-06-08 03:40:15

+0

可悲的是。我不記得我使用的解決方法。我想我開始使用POCO對象。 – 2012-06-09 10:55:11

回答