У меня есть две простые таблицы - Книга и Отзывы с отношением Один-ко-многим.
![enter image description here](https://i.stack.imgur.com/ah8sv.png)
У меня есть только 1 книга и 5 отзывов, связанныхи я хочу удалить связь между первым отзывом и его книгой. Поэтому я делаю следующее:
SampleContext context = new SampleContext();
var firstFeedback = context.Feedbacks.First();
var book = context.Book.Include(x=>x.Feedbacks).First();
firstFeedback.FkBookNavigation = null;
//I tried to do it like this as well - result is the same:
//book.Feedbacks.Remove(firstFeedback);
//firstFeedback.FkBook = null;
//True
Console.WriteLine(context.Entry(firstFeedback).Reference(x => x.FkBookNavigation).IsModified);
//True
Console.WriteLine(context.Entry(firstFeedback).Property(x=>x.FkBook).IsModified);
//False ???
Console.WriteLine(context.Entry(book).Collection(x=>x.Feedbacks).IsModified);
Я не понимаю, почему свойство навигации Feedbacks не изменяется. Поэтому я использовал Rider, чтобы выяснить, что происходит, и нашел один интересный метод, который использует свойство IsModified:
private bool CollectionContainsNewOrChangedRelationships(object relatedEntity)
{
InternalEntityEntry entry = this.InternalEntry.StateManager.TryGetEntry(relatedEntity, this.Metadata.GetTargetType());
if (entry == null)
return false;
if (entry.EntityState != EntityState.Added && entry.EntityState != EntityState.Deleted)
return this.Metadata.ForeignKey.Properties.Any<IProperty>(new Func<IProperty, bool>(entry.IsModified));
return true;
}
Так что EF выполняет итерации через свойство навигации Feedbacks и передает каждый элемент из этой коллекции в метод CollectionContainsNewOrChangedRelationships. Он выглядит хорошо, так как этот метод должен возвращать true, поскольку объект firstFeedback имеет состояние «Modified», а его внешний ключ был установлен в NULL.
Проблема заключается в том, что EF удаляет объект firstFeedback из свойства навигации Feedbacks до итерации коллекциии вызывая CollectionContainsNewOrChangedRelationships для каждого из элементов. Вот почему IsModified возвращает false - только нетронутые элементы остаются в свойстве навигации Feedbacks.
Полагаю, я не до конца понимаю эту концепцию. Заранее спасибо за помощь.