Карта только изменила свойства? - PullRequest
11 голосов
/ 25 апреля 2011

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

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

Ответы [ 4 ]

14 голосов
/ 26 апреля 2011

Да, это можно сделать, но вы должны указать, когда пропустить свойство назначения, используя 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);
3 голосов
/ 18 марта 2016

Да; Я написал этот метод расширения для отображения только грязных значений из модели в 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();
1 голос
/ 23 апреля 2018

@ Мэтью Стивен Монкан прав, но, похоже, AutoMapper изменил API. Я поставлю новый для других.

public static IMappingExpression<TSource, TDestination> MapOnlyIfChanged<TSource, TDestination>(this IMappingExpression<TSource, TDestination> map)
    {
        map.ForAllMembers(source =>
        {
            source.Condition((sourceObject, destObject, sourceProperty, destProperty) =>
            {
                if (sourceProperty == null)
                    return !(destProperty == null);
                return !sourceProperty.Equals(destProperty);
            });
        });
        return map;
    }

это все

0 голосов
/ 25 апреля 2011

Нет.

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


Вручную:

customer.LastName = viewModel.LastName

Изменение бизнес-состояния слишком важно, чтобы делать иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...