Automapper — игнорирование при отображении

Можно ли игнорировать в зависимости от значения назначения?

Смотри, что я хочу сделать:

object c;
var key = ce.CreateEntityKey<CustomerDataContract, Customer>("FullCustomerSet", item, o => o.ID);

if (ce.TryGetObjectByKey(key, out c))
{
    Mapper.Map(item, (Customer)c);
}
else
{
    c = Mapper.Map<CustomerDataContract, Customer>(item);
    ce.AddObject("FullCustomerSet", c);
}

Игнорируйте часть CreateEntityKey — это просто создание EntityKey и получите предмет из EDM. ce относится к типу ObjectContext.

Что я хочу сделать, так это попытаться получить объект из EDM, обновить его с помощью AutoMapper или, если его там нет, создать его с помощью AutoMapper.

Проблема в том, что AutoMapper сопоставляет все свойства - даже первичные ключи, которые не могут быть изменены edm, и я получаю неприятное исключение. Я могу игнорировать ПК в CreateMap, но тогда я не смогу сделать вторую часть с созданием. Я получаю ПК из других источников...

Одна вещь, которую я могу рассмотреть, это что-то в CreateMap - некоторое условное игнорирование целевого объекта или фактически используемого метода. Другой способ — применить некоторые игнорирующие свойства в методе Mapper.Map или выполнить сопоставление вручную следующим образом:

var map = Mapper.FindTypeMapFor<TSource, TDestination>();
foreach (var item in map.GetPropertyMaps().OrderBy(o=>o.GetMappingOrder()))
{
    if (ignore.Contains(item.DestinationProperty.Name))
    {
        continue;
    }
    //and now I should do some mapping, but don't know how...
}

Вопрос простой: Как я могу это сделать? :)


person WooBoo    schedule 20.04.2010    source источник


Ответы (1)


Как насчет того, чтобы игнорировать PK, а затем просто выполнить c.YourPK = somevalue во второй части?

person epitka    schedule 20.04.2010
comment
да... похожая идея. Я просто создаю или получаю его из магазина, а затем только применяю к нему сопоставление, игнорируя ПК. спасибо - person WooBoo; 23.04.2010