Карта изменила только свойства?

Используя AutoMapper, можно ли отображать только измененные свойства из модели просмотра в объект домена?

Проблема, с которой я сталкиваюсь, заключается в том, что если в View Model нет свойств (null), то они переписывают объекты домена и сохраняются в базе данных.

Ответ 1

Да, это можно сделать, но вы должны указать, когда пропустить свойство назначения с помощью Condition() в вашей конфигурации сопоставления.

Вот пример. Рассмотрим следующие классы:

public class Source
{
    public string Text { get; set; }
    public bool Map { get; set; }
}

public class Destination
{
    public string Text { get; set; }
}

Первая карта не будет перезаписываться destination.Text, но вторая будет.

Mapper.CreateMap<Source, Destination>()
            .ForMember(dest => dest.Text, opt => opt.Condition(src => src.Map));

var source = new Source { Text = "Do not map", Map = false };
var destination = new Destination { Text = "Leave me alone" };
Mapper.Map(source, destination);
source.Map = true;
var destination2 = new Destination { Text = "I'll be overwritten" };
Mapper.Map(source, destination2);

Ответ 2

Да; Я написал этот метод расширения для отображения только грязных значений из модели в Entity Framework.

public static IMappingExpression<TSource, TDestination> MapOnlyIfDirty<TSource, TDestination>(
    this IMappingExpression<TSource, TDestination> map)
{
    map.ForAllMembers(source =>
    {
        source.Condition(resolutionContext =>
        {
            if (resolutionContext.SourceValue == null)
                return !(resolutionContext.DestinationValue == null);
            return !resolutionContext.SourceValue.Equals(resolutionContext.DestinationValue);
        });
    });
    return map;
}

Пример:

Mapper.CreateMap<Model, Domain>().MapOnlyIfDirty();

Ответ 3

Нет.

Это как раз одна из причин, по которой вы никогда не переходите из модели viewmodel в модель домена. Изменения в области/бизнес-модели слишком важны для инструмента обработки.


Вручную:

customer.LastName = viewModel.LastName

Изменение бизнес-состояния слишком важно для других.