4

というモデル POCO クラスを作成しましたRecipe。対応する a は、RecipeRepositoryこれらのオブジェクトを永続化します。既存のデータベース上で Code First を使用しています。

Everyには、とテーブルを多対多の関係でリンクするカテゴリがRecipe含まれています。対応する 2 つの外部キーが含まれています。ICollection<RecipeCategory>RecipesCategoriesRecipeCategory

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 つだけ持つためにシングルトン パターンを使用しています。)

4

1 に答える 1

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();
}
于 2011-03-02T12:28:05.363 に答える