EF 4 CTP 5: проблема при попытке удалить объект - PullRequest
4 голосов
/ 27 февраля 2011

Я создал модель класса POCO под названием Recipe;соответствующий RecipeRepository сохраняется эти объекты.Я использую Code First поверх существующей базы данных.

Каждый Recipe содержит 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 из Recipe сущности.В следующем коде не сохраняется удаление категорий в базе данных:

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

    _context.SaveChanges();
}

Я отладил код и могу подтвердить, что коллекции изменены правильно, то есть они не содержат элементов после цикла (Я также использовал метод Clear()).После вызова SaveChanges() они снова заполняются.

Что я делаю не так?

(Может быть, это важно: я использую шаблон Singleton, чтобы иметь только один экземпляр контекста.)

1 Ответ

0 голосов
/ 02 марта 2011

Мне удалось решить проблему следующим образом:

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();
}
...