2012-11-21 48 views
31

我今天從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。

+0

你能發佈你的Automapper代碼嗎?即:Mapper.Map方法調用(您是否使用泛型方法?)。這很可能是「通過設計」,並通過正確的映射器方法或映射器配置輕鬆地恢復到舊的行爲。您可以從automapper返回一個數組,並將其分配給您的IEnumerable屬性,就像在github上的文檔一樣。一旦我看到執行地圖的代碼,我會發佈一個或兩個示例作爲答案。 – BenSwayne

+2

看起來你不會在這裏得到很多運氣。我建議你在[AutoMapper郵件列表](https://groups.google.com/forum/?fromgroups#!forum/automapper-users)上提問 - 這就是專家們所在的地方:) – Mightymuke

+0

你以前是否評論過AutoMapper 2.2 .0支持保持向後兼容性?某些產品可能會停止使用功能/功能(不再支持),而新版本則會導致應用程序重構。 – G21

回答

1

您是否嘗試過使用地圖方法方式: Mapper.Map<DestinationClass, SourceClass>(object to convert)

對於AutoMapper的2.2版本,這是我們如何使用它,它適用於我們。

+2

是的,如果你閱讀問題中的代碼,那就是我正在做的。 – danludwig

+0

對不起,我編輯了我的答案,因爲泛型沒有顯示。希望在調用Map方法時指定源類和目標類。 –

0

我猜測它試圖添加到您的收藏,但由於您的收藏是一個只讀實例(Enumerable.Empty<T>),它實際上不能修改它。我認爲你是正確的,AutoMapper改變了他們如何實例化新類型的代碼。請改用可變實例,例如new List<T>()T[]

+0

我不認爲'T []'是可變的。這是'Enumerable.Empty '默認使用的。 – danludwig

+0

但它可以調整大小/突變,不像Enumerable.Empty <T>引用是隻讀的。 – Haney

+0

我上次檢查時,數組在創建後無法調整大小。他們是固定長度。您可以將數組轉換爲列表,更改其大小,然後將其轉換回另一個數組,但無法直接調整數組的大小。 – danludwig

相關問題