Карта изменила только свойства?
Используя 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
Изменение бизнес-состояния слишком важно для других.