我今天從AutoMapper 2.0.0更新到2.2.0,並意識到更新打破了一些代碼。希望在此之前詢問它,然後在automapper github網站上發佈問題。這是AutoMapper 2.0.0和2.2.0之間的突破性變化嗎?
我的一個目標類型的初始化集合屬性,像這樣:
public class PageOf<TModel>
{
public PageOf()
{
Items = Enumerable.Empty<TModel>();
}
public IEnumerable<TModel> Items { get; set; }
}
隨着automapper 2.0.0,這是罰款。當我更新到2.2.0時,映射到此目標類型會導致一個NotSupportedException,並顯示消息「集合的大小是固定的」。 (這個例外被包裹的AutoMapperMappingException內。)
我能夠通過改變構造函數代碼上面這個來解決該問題:
public PageOf()
{
Items = new List<TModel>();
}
看起來好像AutoMapper 2.0.0被丟棄的任何值在Items屬性中使用set
屬性訪問器,而AutoMapper 2.2.0僅使用get
屬性訪問器並試圖修改現有的IEnumerable。它看起來像Enumerable.Empty<TModel>()
只是代替一個零長度數組,這將解釋異常。
這是一個錯誤? AutoMapper在2.0.0和2.2.0之間發生了什麼變化,導致它忽略目標屬性設置器,而是嘗試修改現有集合?
更新:
按照要求,這裏是CreateMap電話:
public class PagedQueryResultToPageOfItemsProfiler : Profile
{
protected override void Configure()
{
CreateMap<PagedQueryResult<EstablishmentView>, PageOfEstablishmentApiModel>();
}
}
的PageOfEstablishmentApiModel
類從PageOf<EstablishmentApiModel>
繼承。
這裏是Mapper.Map代碼:
var query = Mapper.Map<EstablishmentViewsByKeyword>(input);
var results = _queryProcessor.Execute(query);
var model = Mapper.Map<PageOfEstablishmentApiModel>(results); // exception here
如果一個特殊的映射配置在AutoMapper必要(for example .ConvertUsing(x => x))從2.0.0將2.2.0,我們可能要掛到舊版本。我總是喜歡AM如何自動轉換集合屬性,沒有這些,AM似乎更像ValueInjecter。
你能發佈你的Automapper代碼嗎?即:Mapper.Map方法調用(您是否使用泛型方法?)。這很可能是「通過設計」,並通過正確的映射器方法或映射器配置輕鬆地恢復到舊的行爲。您可以從automapper返回一個數組,並將其分配給您的IEnumerable屬性,就像在github上的文檔一樣。一旦我看到執行地圖的代碼,我會發佈一個或兩個示例作爲答案。 – BenSwayne
看起來你不會在這裏得到很多運氣。我建議你在[AutoMapper郵件列表](https://groups.google.com/forum/?fromgroups#!forum/automapper-users)上提問 - 這就是專家們所在的地方:) – Mightymuke
你以前是否評論過AutoMapper 2.2 .0支持保持向後兼容性?某些產品可能會停止使用功能/功能(不再支持),而新版本則會導致應用程序重構。 – G21