Игнорировать сопоставление одного свойства с Automapper
Я использую Automapper и у меня есть следующий сценарий:
Класс OrderModel имеет свойство с именем 'ProductName', которого нет в базе данных.
Поэтому, когда я пытаюсь сделать сопоставление с:
Mapper.CreateMap<OrderModel, Orders>();
Он генерирует исключение :
" следующие 1 свойства в проекте.модель представления.OrderModel не отображаются: 'ProductName'
Я читал в Вики AutoMapper для проекций противоположный случай (дополнительный атрибут находится в пункте назначения, а не в источник, который на самом деле мой случай )
Как я могу избежать automapper, чтобы сделать отображение этого свойства?
8 ответов:
Я, пожалуй, немного перфекционист; мне не очень нравится ForMember(... х => х.Игнорировать()) синтаксис. Это мелочь, но для меня это важно. Я написал этот метод расширения, чтобы сделать его немного приятнее:
public static IMappingExpression<TSource, TDestination> Ignore<TSource, TDestination>( this IMappingExpression<TSource, TDestination> map, Expression<Func<TDestination, object>> selector) { map.ForMember(selector, config => config.Ignore()); return map; }его можно использовать так:
Mapper.CreateMap<JsonRecord, DatabaseRecord>() .Ignore(record => record.Field) .Ignore(record => record.AnotherField) .Ignore(record => record.Etc);вы также можете переписать его для работы с
params, но мне не нравится внешний вид метода с нагрузками лямбд.
вы можете сделать это:
conf.CreateMap<SourceType, DestinationType>() .ForSourceMember(x => x.SourceProperty, y => y.Ignore());
теперь есть (AutoMapper 2.0) атрибут IgnoreMap, который я собираюсь использовать, а не свободный синтаксис, который немного тяжелый IMHO.
только для тех, кто пытается сделать это автоматически, вы можете использовать метод расширения, чтобы игнорировать несуществующие свойства тип назначения :
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) { var sourceType = typeof(TSource); var destinationType = typeof(TDestination); var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType) && x.DestinationType.Equals(destinationType)); foreach (var property in existingMaps.GetUnmappedPropertyNames()) { expression.ForMember(property, opt => opt.Ignore()); } return expression; }используется следующим образом:
Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();спасибо Can Gencer за подсказку:)
источник : http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/
при отображении модели представления обратно в модель домена, это может быть намного чище, чтобы просто проверить исходный список членов, а не список членов назначения
Mapper.CreateMap<OrderModel, Orders>(MemberList.Source);теперь моя проверка сопоставления не терпит неудачу, требуя другого
Ignore(), каждый раз, когда я добавляю свойство в свой доменный класс.
Я оценил расширение, добавленное Стивом Рукутсом, поэтому я решил добавить еще один метод расширения, основанный на его примере. Надеюсь, что это поможет кому-то:
public static IMappingExpression<TSource, TDestination> Map<TSource, TDestination>( this IMappingExpression<TSource, TDestination> map, Expression<Func<TSource, object>> src, Expression<Func<TDestination, object>> dst) { map.ForMember(dst, opt => opt.MapFrom(src)); return map; }использование:
Mapper.Initialize(cfg => cfg.CreateMap<UserModel, UserDto>() .Map(src => src.FirstName + " " + src.LastName, dst => dst.UserName));
Привет всем, пожалуйста, используйте это работает прекрасно... для автоматического отображения используйте несколько .ForMember В C#
if (promotionCode.Any()) { Mapper.Reset(); Mapper.CreateMap<PromotionCode, PromotionCodeEntity>().ForMember(d => d.serverTime, o => o.MapFrom(s => s.promotionCodeId == null ? "date" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", DateTime.UtcNow.AddHours(7.0)))) .ForMember(d => d.day, p => p.MapFrom(s => s.code != "" ? LeftTime(Convert.ToInt32(s.quantity), Convert.ToString(s.expiryDate), Convert.ToString(DateTime.UtcNow.AddHours(7.0))) : "Day")) .ForMember(d => d.subCategoryname, o => o.MapFrom(s => s.subCategoryId == 0 ? "" : Convert.ToString(subCategory.Where(z => z.subCategoryId.Equals(s.subCategoryId)).FirstOrDefault().subCategoryName))) .ForMember(d => d.optionalCategoryName, o => o.MapFrom(s => s.optCategoryId == 0 ? "" : Convert.ToString(optionalCategory.Where(z => z.optCategoryId.Equals(s.optCategoryId)).FirstOrDefault().optCategoryName))) .ForMember(d => d.logoImg, o => o.MapFrom(s => s.vendorId == 0 ? "" : Convert.ToString(vendorImg.Where(z => z.vendorId.Equals(s.vendorId)).FirstOrDefault().logoImg))) .ForMember(d => d.expiryDate, o => o.MapFrom(s => s.expiryDate == null ? "" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", s.expiryDate))); var userPromotionModel = Mapper.Map<List<PromotionCode>, List<PromotionCodeEntity>>(promotionCode); return userPromotionModel; } return null;
Comments