我創建了一個名爲Recipe
的模型POCO類;相應的RecipeRepository
仍然存在這些對象。我在現有數據庫之上使用Code First。EF 4 CTP 5:嘗試刪除實體時遇到問題
每Recipe
包含在許多一對多的關係Recipes
和Categories
錶鏈接類別的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模式僅具有上下文的一個實例)
確定只有這個代碼被執行?這個錯誤通常意味着你的配方有一些掛起的關係到尚未保存的類別。此外,Find方法能夠從DbContex的內部存儲裝載實體,並且只有在找不到它時纔會查詢數據庫。你什麼時候實例化你的DbContext?另一件事:爲什麼食譜包含ICollection而不是ICollection ? –
2011-02-27 17:38:05
@Ladislav:請參閱我更新的帖子。 – 2011-02-27 22:25:19
沒有人有想法嗎? – 2011-03-02 11:54:46