2015-01-27 5 views
2

У меня есть viewmodel, который аналогичен модели домена (но включает в себя дополнительные свойства).Обновление существующей модели домена с использованием наборов AutoMapper NULL

public class ProductViewModel 
{ 
    public string Name { get; set; } 
    public string ShortDescription { get; set; } 
    public string FullDescription { get; set; } 
    public string AdminComment { get; set; } 
} 

Из вышеперечисленного, я использую только некоторые свойства на моей странице просмотра.

В то время как я использую Automapper сопоставить мою существующую модель, все мои ViewModel поля, чтобы получить карту с domainmodel полея.

Mapper.Map(productViewModel, product); 

Благодаря вышеописанному отображению всего неиспользованное ViewModel поле (по умолчанию неиспользуемого полого ViewModel имеет значение NULL) отображается в модель предметной области. Он заменяет мои существующие данные базы данных значениями NULL.

Есть ли способ исключить значения NULL и значения свойств по умолчанию из сопоставления?

Примечания:

  • я наткнулся Using Automapper to update an existing Entity POCO
  • Если мы используем скрытые поля для исключенных свойств выше проблема будет решена, поскольку ViewModel будет нести данные, используя скрытые поля. Но я не предпочитаю этого!
  • Я попытался следующий код, который не работает:

    Mapper.CreateMap<ProductViewModel, Product>() 
         .ForAllMembers(opt => 
          opt.Condition(srs => (!srs.IsSourceValueNull || IsDefaultValue(srs.SourceValue, srs.SourceType)))); 
    

Edit:

После того как я попробовал Automapper skip null values with custom resolver (Спасибо abatishchev). Я использовал Разрешитель, но получаю ошибку недостающее конфигурацию типа карты или неподдерживаемый отображение

Мой фрагмент кода:

... 
public System.DateTime CreatedOnUtc { get; set; } 
public System.DateTime UpdatedOnUtc { get; set; } 
public virtual ICollection<BackInStockSubscription> BackInStockSubscriptions { get; set; } 
public virtual ICollection<OrderItem> OrderItems { get; set; } 

Хотя resolver доступ к BackInStockSubscriptions в приведенном выше коде, я получаю сообщение об ошибке ,

Любые подсказки?

+0

Вы пробовали распознаватель от http://stackoverflow.com/questions/20021633/automapper-skip-null-values-with-custom-resolver? – abatishchev

+0

Я пробовал, но получаю ошибку ** Отсутствует конфигурация карты типа или неподдерживаемое отображение. ** Резольвер закончил доступ ко всем свойствам модели домена и начал получать доступ к приведенным ниже виртуальным сопоставлениям. К моменту доступа к «BackInStockSubscriptions» вышеупомянутая проблема происходит.
'public System.DateTime CreatedOnUtc {get; задавать; } public System.DateTime ОбновленоOnUtc {get; задавать; } публичный виртуальный ICollection BackInStockSubscriptions {get; задавать; } public virtual ICollection OrderItems {get; задавать; } ' Нужно ли мне что-нибудь делать? –

+0

Можете ли вы поместить это в свой вопрос? Трудно прочитать код из комментария. – abatishchev

ответ

1

Я исправил проблему, добавив свойства ICollection, чтобы игнорировать список в AutoMapper.

Исправлен код:

Mapper.CreateMap<ProductViewModel, Product>() 
     .ForMember(dest => dest.BackInStockSubscriptions, mo => mo.Ignore()) 
     .ForMember(dest => dest.OrderItems, mo => mo.Ignore())    
     .ForAllMembers(c => c.IgnoreIfSourceIsNull()); //To checking NULL 
6

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

Я написал инструмент, и я никогда, никогда не делаю этого. У вас есть коллекции, ленивые загруженные объекты, выборка, слияние, загрузка, так много вещей, которые могут пойти не так.

Просто. Не. Сделай это.

+1

Тогда как мы можем обновить данные viewmodel обратно в db? Отображение свойства по свойству? (Так как у меня есть 25 свойств, это очень длительный процесс обряда?) Примечание. Как я знаю, многие пользователи используют automapper для сопоставления данных в режиме просмотра модели домена. Какова наилучшая практика для подобных сценариев? –

+0

Я действительно не знаю, честно. Системы, которые я строю, представляют собой целевые системы, а не «гигантскую страницу редактируемых полей». Это всего лишь несколько полей, обычно с проверкой и побочными эффектами, где я бы не хотел просто передавать данные от одного к другому. Я слышал о людях, использующих условия и резольверов и т. Д., Но это просто не то, что я когда-либо делал. –

+0

Спасибо Джимми. Но в моем случае я могу предложить любое решение? –

Смежные вопросы