我已經更新AutoMapper其2版本,我已經得到了很多問題,現在...Automapper拋出System.ArgumentException
我已經得到的ItemToMap
列表以及所有這些對象有到了同一個對象Tag
當我嘗試映射ItemToMap
與ItemToMapDto
一個參考,我得到這個錯誤:
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
存在失敗
這不是問題所在。我爲所有事情創建了一張地圖。我更新了我的帖子以顯示它。 –
屬性不是問題。所有'string'和'string.IsNullOrEmpty'總是爲false。 –
這個問題是由於Automapper的'ResolutionContext'的緩存策略造成的。查看我的編輯2瞭解更多信息 –