AutoMapper с EF Core - неизмененная сущность помечена как измененная и удаленная
У меня странная проблема с комбинацией EF Core 2.0 и AutoMapper 8.1.0.
Так как извлечь какой-нибудь значимый фрагмент реального кода было бы очень нетривиально, я опишу достаточно простую структуру:
У меня есть модель сущности базы данных (только POCO), сопоставленная с базой данных через EF Core Code First - определенная с использованием свободного API. Выше этого есть модель предметной области. Между этими двумя слоями находится конфигурация AutoMapper. Когда необходимо сопоставить обновленный объект домена с простой сущностью, он использует перегрузку
Mapper.Map(DomainObjectInstance, EntityObjectInstance, DomainType, EntityType);
для обновления фактического объекта EntityObjectInstance, отслеживаемого EF Core.
Раньше это работало очень хорошо. К сожалению, в модели произошли некоторые рефакторинги, после которых она перестала работать вместе с EF Core. После обновления одного из доменных объектов он удаляется из базы данных.
Что я узнал - позвонив в Map
метод, ChangeTracker
в DBContext
обнаруживает изменение одного из важных внешних ключей - это объект, который также содержится в коллекции другого объекта (типичное отношение 1-M). Однако, если я осмотрю недвижимость, естьIsChanged = true
, но на самом деле CurrentValue
а также OriginalValue
такие же.
Также интересно то, что CurrentValue == OriginalValue
возвращается false
но CurrentValue.Equals(OriginalValue)
возвращается true
из-за un/boxing.
Это изменение и его обнаружение определенно вызвано во время Map
метод. Если я это прокомментирую, конвейер работает нормально. Хотя в данных нет никаких фактических изменений, и я установил сопоставление для этого свойства, чтобы оно игнорировалось, изменение в EF Core по-прежнему обнаруживается. Если я выполняю "сопоставление вручную" и сам присваиваю значения от объекта домена объекту сущности, проблема исчезает. Но есть довольно много полей, и я хочу извлечь выгоду из использования autoMapper.
1 ответ
Я до сих пор не знаю, что именно не так и почему. Но причина кроется где-то между EF Core и AutoMapper. Проблема на самом деле заключалась в том, что во время рефакторинга одно из свойств было переименовано. Все настройки, как модель сущности EF, так и конфигурация сопоставления AutoMapper, были скорректированы в соответствии с реорганизованным состоянием. Я также попытался сделать все конфигурации сопоставления сMemberList.None
options и укажите все вручную. Возможно, причина в том, что свойство имеет такое же имя, как и его тип (Project
). Но другие подобные реквизиты работают нормально.
Однако никаких проблем с отображением нет - оно работает или с самим EF Core. Но вместе это просто не получается. (Не) к счастью, на этот раз помогла переименование собственности.
В комментарии Лучан предложил использовать расширение EFCore для AutoMapper - и это не помогло.