Отношения EF4 не обновляются правильно - PullRequest
1 голос
/ 19 октября 2011

Хорошо, я работаю над проектом, и мне только что сообщили об ошибке, с которой у меня возникли проблемы.Код написан «по-другому», и я думаю, что подход первоначальных разработчиков к этому проекту поставил его перед некоторыми проблемами, одной из которых я занимаюсь сегодня.По сути, у нас есть что-то вроде этого:

Review_Comment comment = commentContext.Review_Comment.First(c => c.CommentID == commentID);
commentContext.DeleteObject(comment);
commentContext.SaveChanges();

review.Review_Comment.Clear();
review.Review_Comment.Load(System.Data.Objects.MergeOption.OverwriteChanges);
context.SaveChanges();

Позвольте мне объяснить несколько вещей, а затем я объясню проблему:

  • «обзор» является экземпляром обзоракласс, который является родителем набора "Review_Comments" (т. е. Review_Comments принадлежат одному обзору).
  • Вышеприведенная функция заключается в удалении комментария.
  • Комментарии, в лучшую или в худшую сторону, используют собственный контекст EF4 (отдельно от контекста, к которому прикреплена переменная "review". Это важно.
  • То, что пытался сделать первоначальный разработчик, я думаю, было загрузить комментарий в отдельном контексте, удалить его, а затем обновить EntityCollection of Review_Comments в отдельном классе "Review"вручную.

Однако, когда вызывается context.SaveChanges (), мы получаем следующую ошибку:

Операция не выполнена: связь не может быть изменена, поскольку один илибольше свойств внешнего ключа не допускает значения NULL. Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение. Если внешний ключ не поддерживает значения NULL, новое отношение должно бытьопределено, свойству внешнего ключа должно быть присвоено другое ненулевое значение, или не связанный объект должен быть удален.

Я видел этоошибка, описанная, когда люди пытаются удалить, скажем, объект Order и связанные элементы OrderItems не удаляются правильно, но этот случай отличается.Мы пытаемся удалить один дочерний объект, а затем обновить EntityCollection для другой сущности, используя отдельный контекст.

Надеюсь, что все это имеет смысл, дайте мне знать, если я могу помочь что-то прояснить.Есть мысли?

РЕДАКТИРОВАТЬ: Я должен отметить, что я смог решить эту проблему, используя тот же контекст, что и остальная часть страницы.Однако, в этом случае, из-за нескольких зависимостей, представленных предыдущими разработчиками, мне нужно сохранить второй контекст, иначе я должен переписать тонну кода, чтобы удалить зависимости во втором контексте, просто чтобы исправить эту ошибку.Я надеюсь найти решение, которое не займет так много времени.Цель состоит в том, чтобы удалить комментарий, а затем перезагрузить отдельную сущность Review_Comment EntityCollection и иметь возможность вызывать SaveChanges () без этой ошибки.

1 Ответ

1 голос
/ 19 октября 2011

Ваша проблема в том, что .Clear () заставляет второй контекст отсоединять Review_Comments от его Review, он никогда не осознает, что Review_Comment действительно был удален.

Вы должны сделать это вместо

  context.Refresh(RefreshMode.StoreWins, review.Review_Comment );
  context.SaveChanges();

Если вы смотрите состояние сущности комментария в "review.Review_Comment", вы должны увидеть, что после обновления его состояние становится "Отсоединено", а не "Изменено"

...