Я никогда не сталкивался с этим нечетным поведением перед Automapper. Для начала я использую Automapper 3.3.0 и Entity Framework 6.1.3. У меня есть метод, который извлекает данные сущности через сущность framework. Перед возвратом данных он сопоставляет его с моделью домена. За исключением трех (3) свойств, имена соответствующих свойств совпадают между сущностью и доменом, таким образом, вы увидите в примере кода, который я предоставляю, что при создании карты просто три (3) вызова ForMember.Automapper иногда не удается отобразить свойства, установленные через ForMember
Это прекрасно работает в большинстве случаев, как и следовало ожидать. Тем не менее, иногда, и я не могу за всю свою жизнь выполнить точные шаги для воспроизведения, сопоставление выполняется успешно, за исключением трех (3) явно отображаемых свойств.
Вот код, который я считаю уместное:
var dailyPriceHistories =
MapToDomain(_clearDbEntities.get_DailyPriceHistory(startDate.Date, endDate.Date).ToList());
FYI, вызов ToList предназначен для предотвращения ленивых проблем с загрузкой от EF.
И, картограф:
private static IList<DailyPriceHistory> MapToDomain(List<get_DailyPriceHistory_Result> someDataEntities)
{
Mapper.CreateMap<get_DailyPriceHistory_Result, DailyPriceHistory>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.DailyPriceHistory_ID))
.ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.AllProducts_ID))
.ForMember(dest => dest.DateInfoId, opt => opt.MapFrom(src => src.DateInfo_ID));
return Mapper.Map<List<get_DailyPriceHistory_Result>, List<DailyPriceHistory>>(dailyPriceHistoryEntities);
}
Если я делаю IISRESET, все в порядке, он снова работает. Кажется, это происходит, когда я немного перешел в режим отладки в Visual Studio 2013. Это похоже на то, что он просто забывает, как сопоставить эти свойства. Передаваемые данные сущности всегда содержат значения, кстати, они просто не отображают три из них в домене.
Любая помощь была бы принята с благодарностью. Благодаря!
Сначала поместите создание карты в приложение. Это нужно сделать один раз. Я не знаю эффект нескольких потоков, выполняющих «Mapper.CreateMap» одновременно. –
Хорошо, я дам этот рип. Будучи статическим методом, я был под пониманием того, что карта будет создана только один раз. Я понимаю это неправильно? Ох ... нет ... Теперь я вижу, что, разумеется, вызов CreateMap происходит каждый раз. Я собираюсь переместить вызов CreateMap, как вы предложили, и просто вызвать его в моем приватном статическом методе. –
@GertArnold Я вкопался в код AutoMapper, а 'Mapper.CreateMap' не является потокобезопасным. @Jim Speaker, если вы вызываете «Mapper.CreateMap» в нескольких местах, все будет выглядеть странно, как вы видите. Вы должны создавать все * перед *, вы начинаете использовать «Mapper». Также вы думаете о статических конструкторах, которые запускаются только один раз. Статические методы запускаются каждый раз, когда вы их вызываете. – shf301