automapper - простейший вариант записи только в целевое свойство, если исходное свойство отличается? - PullRequest
3 голосов
/ 23 февраля 2011

ПРИМЕЧАНИЕ. В этом сценарии используются две модели структуры сущностей для синхронизации данных между двумя базами данных, но я думаю, что это применимо к другим сценариям. Можно попытаться решить эту проблему и на стороне EF (как в этот вопрос SO ), но я хотел посмотреть, сможет ли AutoMapper справиться с этим из коробки

Я пытаюсь выяснить, может ли AutoMapper (легко :) сравнивать значения source и dest (при использовании его для синхронизации с существующим объектом) и выполнять копирование, только если значения различаются (по умолчанию равно Equals) , потенциально передавая в Func, например, если я решил сделать String.Equals с StringComparison.OrdinalIgnoreCase для некоторой конкретной пары значений). По крайней мере, для моего сценария, я в порядке, если он ограничен только случаем TSource == TDest (я буду синхронизироваться с int, string и т. Д., Поэтому я не думаю, что мне понадобятся какие-либо преобразователи типов)

Просматривая примеры и тесты, кажется, что наиболее близким является условное отображение (src \ UnitTests \ ConditionalMapping.cs), и я бы использовал перегрузку Condition, которая принимает Func (поскольку другой перегрузки недостаточно, так как нам тоже нужна информация о десте). Это, конечно, выглядит на первый взгляд так, как будто оно будет работать нормально (я еще не использовал его), но в итоге я бы определил это для каждого члена (хотя, полагаю, я мог бы определить небольшое количество действий / методов и по крайней мере, повторно используйте их вместо N разных лямбд).

Это самый простой доступный маршрут (кроме изменения AutoMapper) для получения «единственной копии, если значения source и dest отличаются» или есть другой способ, которого я не вижу? Если является простейшим маршрутом, было ли это уже сделано ранее? Такое ощущение, что я, вероятно, изобретаю колесо здесь. :)

1 Ответ

0 голосов
/ 08 января 2012

Чак Норрис (ранее известный как Ому? :) уже ответил на это, но с помощью комментариев, поэтому просто отвечая и принимая повторение того, что он сказал.

@ Джеймс Мэннинг, вам придется унаследовать ConventionInjection, переопределить метод Match и записать туда возвращаемое значение c.SourceProp.Name = c.TargetProp.Name && c.SourceProp.Value! = c.TargetProp.Value и после использования его target.InjectFrom (source);

В моем конкретном случае, так как в любом случае у меня была пара других потребностей, я просто настроил генерацию кода EF4, чтобы включить проверку того, совпадает ли новое значение с текущим значением (для скаляров), которое заботитсяпроблемы с созданием «условной» копии - теперь я могу использовать Automapper или ValueInject или что-либо как есть.:)

Для всех, кто интересуется изменением, когда вы получаете файл * .tt по умолчанию, самый простой способ сделать это изменение (по крайней мере, я мог бы сказать) - это найти 2 строки вроде:

if (ef.IsKey(primitiveProperty))

и измените оба на что-то вроде:

if (ef.IsKey(primitiveProperty) || true) // we always want the setter to include checking for the target value already being set
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...