というモデル POCO クラスを作成しましたRecipe
。対応する a は、RecipeRepository
これらのオブジェクトを永続化します。既存のデータベース上で Code First を使用しています。
Everyには、とテーブルを多対多の関係でリンクするカテゴリがRecipe
含まれています。対応する 2 つの外部キーが含まれています。ICollection<RecipeCategory>
Recipes
Categories
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();
}
ただし、上記のコードは、System.InvalidOperationException
実行するたびに「削除済み状態のエンティティとの関係を追加することは許可されていません」を受け取るため、機能しません。
エラーメッセージは何を表し、どうすれば問題を解決できますか? 私が達成しようとしている唯一のことは、エンティティを削除することです。
@Ladislav: に置き換えましICollection<RecipeCategory>
たICollection<Category>
。偶然にも、ReSharper はvirtual
キーワードをリファクタリングしました。
ただし、エンティティCategory
から a を削除できないという問題が残ります。Recipe
次のコードは、カテゴリの削除をデータベースに保持しません。
private void RemoveAllCategoriesAssignedToRecipe()
{
foreach (Category category in _recipe.Categories.ToArray())
{
_recipe.Categories.Remove(category);
category.Recipes.Remove(_recipe);
}
_context.SaveChanges();
}
コードをデバッグしたところ、コレクションが正しく変更されていることを確認できました。つまり、ループの後に要素が含まれていません (メソッドも使用しましたClear()
)。を呼び出した後SaveChanges()
、再び入力されます。
私は何を間違っていますか?
(おそらく重要です。コンテキストのインスタンスを 1 つだけ持つためにシングルトン パターンを使用しています。)