4

我創建了一個名爲Recipe的模型POCO類;相應的RecipeRepository仍然存在這些對象。我在現有數據庫之上使用Code First。EF 4 CTP 5:嘗試刪除實體時遇到問題

Recipe包含在許多一對多的關係RecipesCategories錶鏈接類別的ICollection<RecipeCategory>RecipeCategory包含相應的兩個外鍵。

我的控制器和存儲庫的邏輯的簡化版本,看起來像這樣(我註釋掉了所有的檢查授權,null對象等爲簡單起見):

public ActionResult Delete(int id) 
{ 
    _recipeRepository.Remove(id); 

    return View("Deleted"); 
} 

版本庫的Remove方法不做任何事,但下面:

public void Remove(int id) 
{ 
    Recipe recipe = _context.Recipes.Find(id); 
    _context.Recipes.Remove(recipe); 
    _context.SaveChanges(); 
} 

Howevery,上面的代碼不工作,因爲我收到System.InvalidOperationException我每次運行它:添加了一個連接的關係不允許處於已刪除狀態的實體。

錯誤信息代表什麼,我該如何解決問題?我試圖達到的唯一目標就是刪除一個實體。


@Ladislav:我已經ICollection<Category>取代ICollection<RecipeCategory>。有意思的是,ReSharper重構了關鍵字virtual

但是,問題仍然存在 - 我無法從Recipe實體中刪除Category。下面的代碼不類別的刪除持久化到數據庫:

private void RemoveAllCategoriesAssignedToRecipe() 
{ 
    foreach (Category category in _recipe.Categories.ToArray()) 
    { 
     _recipe.Categories.Remove(category); 
     category.Recipes.Remove(_recipe); 
    } 

    _context.SaveChanges(); 
} 

我已經調試代碼,並可以確認集合正確修改 - 也就是說,它們包含在循環之後沒有元素(我有也使用Clear()方法)。在致電SaveChanges()後,他們再次填充。

我在做什麼錯?

(也許這是很重要的。我現在用的是Singleton模式僅具有上下文的一個實例)

+2

確定只有這個代碼被執行?這個錯誤通常意味着你的配方有一些掛起的關係到尚未保存的類別。此外,Find方法能夠從DbContex的內部存儲裝載實體,並且只有在找不到它時纔會查詢數據庫。你什麼時候實例化你的DbContext?另一件事:爲什麼食譜包含ICollection 而不是ICollection ? – 2011-02-27 17:38:05

+0

@Ladislav:請參閱我更新的帖子。 – 2011-02-27 22:25:19

+0

沒有人有想法嗎? – 2011-03-02 11:54:46

回答

0

我是能夠解決問題的方式如下:

private void RemoveAllCategoriesAssignedToRecipe() 
{ 
    foreach (Category category in _recipe.Categories.ToArray()) 
    { 
     Category categoryEntity = _categoryRepository.Retrieve(category.CategoryID); 

     var recipesAssignedToCategory = categoryEntity.Recipes.ToArray(); 
     categoryEntity.Recipes.Clear(); 

     foreach (Recipe assignedRecipe in recipesAssignedToCategory) 
     { 
      if (assignedRecipe.RecipeID == _recipe.RecipeID) 
      { 
       continue; 
      } 

      categoryEntity.Recipes.Add(assignedRecipe); 
     } 

     _context.Entry(categoryEntity).State = EntityState.Modified; 
    } 

    _recipe.Categories.Clear(); 
    _context.SaveChanges(); 
} 
相關問題