#c# #automapper
Вопрос:
Сценарий
Этот сценарий является упрощенной моделью, обратите внимание
- частные конструкторы без параметров
- частный сеттер по свойствам
class Nested { public int Month { get; private set; } public int Year { get; private set; } private Nested() { } public Nested(int month, int year) { // There are some validations but the simplicity of this example I omitted its Month = month; Year = year; } } class Root { public int Id { get; private set; } public string Title { get; private set; } public Nested Nested { get; private set; } private Root() { } public Root(int id, string title, Nested nested) { // There are some validations but the simplicity of this example I omitted its Id = id; Title = title; Nested = nested; } }
Теперь у меня есть класс выравнивания БД
class RootDb { public int Id { get; set; } public string Title { get; set; } public int? Nested_Month { get; set; } public int? Nested_Year { get; set; } }
Чего достичь
Я хочу сопоставить корневую базу данных с корневой, но опустить (установить значение null) Вложенное свойство ValueObject, если ВСЕ поля имеют значения null и НЕ ИСПОЛЬЗУЮТ общедоступный вложенный конструктор.
Что я пытаюсь
Этот код не работает, вложенное свойство имеет значение Nested { Year = null, Month = null }
CreateMap<Root, RootDb>() .ForMember(p => p.Nested_Month, o => o.MapFrom(f => f.Mested.Month)) .ForMember(p => p.Nested_Year, o => o.MapFrom(f => f.Nested.Year)) .ReverseMap() .ForMember(p=> p.Nested, o => o.Condition(src => src.Nested_Month != null amp;amp; src.Nested_Year != null)) ;
Рабочее решение
Я нашел это решение, но является ли оно единственным? Я думаю, что это слишком сложно
CreateMap<Root, RootDb>() .ForMember(p => p.Nested_Month, o => o.MapFrom(f => f.Mested.Month)) .ForMember(p => p.Nested_Year, o => o.MapFrom(f => f.Nested.Year)) ; CreateMap<RootDb, Nested>() .ForMember(p => p.Month, o => o.MapFrom(f => f.Nested_Month)) .ForMember(p => p.Year, o => o.MapFrom(f => f.Nested_Year)) .ForAllOtherMembers(p=> p.Ignore()) ; CreateMap<RootDb, Root>() .ForMember(p => p.Nested, o => { o.Condition(src => src.Nested_Month != null amp;amp; src.Nested_Year != null); o.MapFrom(f => f); }) ;
Есть какие-нибудь предложения ?
Комментарии:
1. Просто общее соображение: я люблю использовать AutoMapper для простого сопоставления. Если это становится непросто, я добавляю процедурный код для отображения оставшихся полей после картографа. Вызов карты. Код должен быть понятен будущим разработчикам