Проблема вызвана режимом доступа к свойству EF Core по умолчанию и ToList()
вызовом здесь
public IEnumerable<CaseWorkNote> WorkNotes => _workNotes?.ToList();
Не уверен, какую методологию вы используете, но вы нарушаете простое правило хорошего дизайна, которое свойство (и особенно тип коллекции) не должно распределять при каждом получении. Не только потому, что это неэффективно, но и позволяет «умному» клиенту, такому как EF Core, определять фактический тип как List
и пытаться использовать его для добавления элементов при загрузке связанных данных .
На самом деле с этим типом реализации они добавляют в список, который отбрасывается, другими словами - никуда. Так что исправление загрузки данных / свойств навигации в EF Core не работает, что также может повлиять на систему отслеживания изменений и привести к странным действиям.
Чтобы устранить проблему с EF Core, вы должны настроить EF Core на непосредственное использование вспомогательного поля . Самый простой способ - установить его глобально в переопределении OnModelCreating
:
modelBuilder.UsePropertyAccessMode(PropertyAccessMode.Field);
Его также можно установить для каждой сущности или для свойства сущности, но я бы предложил вышеупомянутое, более того, одно из ожидаемых изменений в EF Core 3.0 заключается в том, что Поля поддержки будут использоваться по умолчанию .
В любом случае, теперь рассматриваемая проблема будет решена.
Тем не менее, будет лучше следовать хорошей практике. Элемент _workNotes
должен быть инициализирован инициализатором или конструктором класса, а свойство getter должно возвращать его напрямую. Если идея состояла в том, чтобы запретить вызывающей стороне получить доступ к закрытому члену путем приведения результата, то есть другие способы предотвратить то, что не клонирует содержимое коллекции. Например:
//Aggregated entity
private readonly HashSet<CaseWorkNote> _workNotes = new HashSet<CaseWorkNote>();
public IEnumerable<CaseWorkNote> WorkNotes => _workNotes.Select(e => e);
//
Независимо от того, сохраняете ли вы текущую реализацию свойства навигации или нет, вы должны позволить EF Core напрямую использовать поле поддержки.