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.Noneoptions и укажите все вручную. Возможно, причина в том, что свойство имеет такое же имя, как и его тип (Project). Но другие подобные реквизиты работают нормально.

Однако никаких проблем с отображением нет - оно работает или с самим EF Core. Но вместе это просто не получается. (Не) к счастью, на этот раз помогла переименование собственности.

В комментарии Лучан предложил использовать расширение EFCore для AutoMapper - и это не помогло.

Другие вопросы по тегам