2015-08-09 9 views
0

Я никогда не сталкивался с этим нечетным поведением перед 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. Это похоже на то, что он просто забывает, как сопоставить эти свойства. Передаваемые данные сущности всегда содержат значения, кстати, они просто не отображают три из них в домене.

Любая помощь была бы принята с благодарностью. Благодаря!

+0

Сначала поместите создание карты в приложение. Это нужно сделать один раз. Я не знаю эффект нескольких потоков, выполняющих «Mapper.CreateMap» одновременно. –

+0

Хорошо, я дам этот рип. Будучи статическим методом, я был под пониманием того, что карта будет создана только один раз. Я понимаю это неправильно? Ох ... нет ... Теперь я вижу, что, разумеется, вызов CreateMap происходит каждый раз. Я собираюсь переместить вызов CreateMap, как вы предложили, и просто вызвать его в моем приватном статическом методе. –

+0

@GertArnold Я вкопался в код AutoMapper, а 'Mapper.CreateMap' не является потокобезопасным. @Jim Speaker, если вы вызываете «Mapper.CreateMap» в нескольких местах, все будет выглядеть странно, как вы видите. Вы должны создавать все * перед *, вы начинаете использовать «Mapper». Также вы думаете о статических конструкторах, которые запускаются только один раз. Статические методы запускаются каждый раз, когда вы их вызываете. – shf301

ответ

2

Mapper.CreateMap не является потокобезопасным (и никогда не был на самом деле предназначен). Вы должны создавать свои карты только при запуске, обычно запускаясь для приложений ASP.NET в App_Start в Global.asax.