2012-10-31 393 views
0

我按照我的朱莉Lermans書編程實體框架閱讀有關EF庫模式:的DbContext實體框架的通用倉庫 - 外鍵例外更新實體關係

我有具有多對多名爲Customer的實體與實體收藏

這裏關係是一個更新的一些示例代碼,客戶

customer.CustomerLocation_ID = 5;  

customer.Favourites.clear(); 

customer.State = State.Modified; 
customerRepository.InsertOrUpdate(customer); 

插入然後將做到以下幾點:

Entry(entity).State = EntityState.Modified; 

foreach (var entity in this.ChangeTracker.Entries<IEntityState>()) 
{ 
    IEntityState stateInfo = entity.Entity; 
    entity.State = StateHelpers.ConvertState(stateInfo.State); 
} 

後來總算:

context.SaveChanges(); 

一旦保存,我得到一個唯一的密鑰異常的收藏,因爲收藏夾名稱是唯一的。但我沒有在收藏夾中添加任何內容。

當我刪除.clear()行時,一切都很好保存。

更新:

我在這段代碼只是嘗試一些東西,現在的作品加入。

foreach (var fav in customer.Favourites) 
{ 
    fav.State = State.Modified; 
} 

這是否意味着即使我正在影響客戶,我仍然需要將收藏夾標記爲已修改,以便跟蹤和更新它們?我只是不認爲我必須這樣做。

+1

您正在對您的客戶進行一系列關於已清除收藏夾的刪除操作(實際上,您是在刪除與此客戶關聯的所有收藏夾鏈接記錄)。你確定這是預期的效果嗎? – Tejs

+0

這就是主意。我想刪除所有客戶的最愛。現在就去更新這個問題。 – LivingOnACloud

回答

0

如果您使用實體框架,它應該是爲做這個簡單:

using(var myContext = new MySiteDbContextClassName()) 
{ 
    var selectedCustomer = myContext.Customers.FirstOrDefault(x => x.CustomerId == someCustomerId); 

    if(selectedCustomer != null) 
    { 
      selectedCustomer.Favorites.Clear(); 
      myContext.SaveChanges(); 
    } 
} 

如果不工作的話聽起來有點像你的配置/映射是錯誤的,你」你需要檢查你的配置。

+0

如果我這樣做,那麼它會正常工作。但是我使用的存儲庫模式涉及將實體發送到此函數中,然後工作單元將保存所有存儲庫工作中的更改。 – LivingOnACloud

+0

如果你的上下文總是可用的,那麼你只能在最後調用'SaveChanges',它仍然是相同數量的代碼。你不必在狀態管理的背景下搞清楚上下文在做什麼。上下文是跟蹤正在清除的最愛,等等。 – Tejs

+0

乾杯Tejs,我要走了,想一分鐘。由於我無法訪問Context,並且在保存更改時正在處理新的上下文,因此使用存儲庫模式是有意義的。 – LivingOnACloud