2012-10-26 68 views
1

我已經更新AutoMapper其2版本,我已經得到了很多問題,現在...Automapper拋出System.ArgumentException

我已經得到的ItemToMap列表以及所有這些對象有到了同一個對象Tag

當我嘗試映射ItemToMapItemToMapDto一個參考,我得到這個錯誤:

AutoMapper.AutoMapperMappingException :

Mapping types: Tag -> TagDto DAL.Entities.Tag -> DTO.Objects.TagDto

Destination path: ItemToMap[][1].Tag.Tag

Source value: Entities.Tag ----> System.ArgumentException : An item with the same key has already been added.

這裏的映射:

Mapper.CreateMap<ItemToMap, ItemToMapDto>(); 
Mapper.CreateMap<Tag, TagDto>(); 

下面是凸顯我的問題的單元測試:

var temp = new List<ItemToMap>(); 
var tag1 = this.RandomTag; 
var length = 10; 

for (int i = 0; i < length; i++) 
{ 
    temp.Add(new ItemToMap() 
    { 
     Tag = tag1, 
    }); 
} 
var record = temp.ToArray(); 
var mapped = Mapper.Map<ItemToMap[], ItemToMapDto[]>(record); 

什麼解決的辦法有我的映射的作品?我正在尋找一個全球性的解決方案,因爲這個問題是遍佈各地的代碼...

編輯1:

的問題來自於下面的構造函數,如果我評論的構造函數的代碼,一切正常......

public class ItemToMapDto 
{ 
    public ItemToMapDto() 
    { 
     /* If I comment the line below, all's fine... But it not the behaviour 
     * I want, I'd like to have a default value for the property... 
     */ 
     this.Tag = new TagDto() { Name = this.RandomText }; 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 

    public TagDto Tag 
    { 
     get; 
     set; 
    } 
} 

編輯2:

Automapper是緩存ResolutionContext重用已經設置解析器。換句話說,它通過映射器循環,並在IsMatch的調用中返回true。要知道這個ResolutionContext是否被緩存,它會檢查目標屬性是否已經設置以及上下文的哈希碼。由於目標是在Ctor中設置的,Automapper認爲這不會被緩存,因此它會調用未緩存的解析器。後者解析器將緩存但因爲散列碼已經在使用高速緩存儲存庫的Dictionary存在失敗

回答

3

這是一個錯誤。該修復將發佈在2.2.1版本中

1

您必須先註冊DAL.Entities.TagDTO.Objects.TagDto雖然你對標籤和TagDto相同的屬性名

我想一些您未映射的Tag類中的屬性。如果是使用Ignore

Mapper.CreateMap<Tag, TagDto>().ForMember(x => x.value, opt => opt.Ignore()); 

看一看Here & Here & Here

+0

這不是問題所在。我爲所有事情創建了一張地圖。我更新了我的帖子以顯示它。 –

+0

屬性不是問題。所有'string'和'string.IsNullOrEmpty'總是爲false。 –

+0

這個問題是由於Automapper的'ResolutionContext'的緩存策略造成的。查看我的編輯2瞭解更多信息 –

相關問題