Отношение один ко многим: ребенок помечен Изменено, а Удалено - PullRequest
1 голос
/ 08 июля 2019

У меня проблемы с использованием отношений «один ко многим» с EntityFramework Core. Когда я удаляю дочерний объект в свойстве List родительского объекта, этот дочерний объект помечается как измененный ChangeTracker (а не удаленный). Однако когда я вызываю SaveChanges для контекста, эта сущность удаляется.

Конечно, я мог бы принудительно установить флаг объекта на Deleted, но я бы предпочел другое решение, потому что я использую AutoMapper для обновления своих объектов. и я не хочу смешивать процесс отображения AutoMapper и контекст EntityFramework.

var parent = new Parent();

var child = new Child();
parent.Childs.Add(child);
await context.SaveChangesAsync();

// removing the first child
parent.Childs.RemoveAt(0);  

// fails (Expected Deleted, got Modified)
Assert.Equal(EntityState.Deleted, context.Entry(child).State); 

1 Ответ

1 голос
/ 09 июля 2019

Лучшее объяснение этого поведения содержится в одном из ожидаемых критических изменений в EF Core 3.0 - Удаление каскадов теперь происходит немедленно по умолчанию :

Старое поведение

До 3.0 EF Core применял каскадные действия (удаление зависимых объектов, когда требуемый участник удален или когда связь с требуемым субъектом разорвана) не происходило до тех пор, пока не был вызван SaveChanges.

Новое поведение

Начиная с версии 3.0, EF Core применяет каскадные действия, как только обнаруживается условие запуска. Например, вызов context.Remove() для удаления главной сущности приведет к тому, что все отслеживаемые связанные обязательные иждивенцы также будут немедленно установлены как удаленные.

Почему

Это изменение было сделано для улучшения взаимодействия со сценариями привязки данных и аудита, в которых важно понимать, какие объекты будут удалены до вызова SaveChanges.

В первом разделе объясняется текущее поведение, а в последнем разделе объясняется, почему они его меняют - чтобы помочь сценариям использования, подобным вашему.

С учетом вышесказанного вам следует либо применить опцию каскада вручную, либо дождаться EF Core 3.0, если вы можете себе это позволить.

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