Странное поведение при удалении отношений между сущностями в EF Core - PullRequest
0 голосов
/ 23 октября 2019

У меня есть две простые таблицы - Книга и Отзывы с отношением Один-ко-многим.

enter image description here

У меня есть только 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.

Полагаю, я не до конца понимаю эту концепцию. Заранее спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...