AutoMapperをバージョン2に更新しましたが、現在多くの問題が発生しています...
私はリストを持っています、ItemToMap
そしてこれらのオブジェクトのすべては同じオブジェクトへの参照を持っていますTag
でマップしようとするItemToMap
とItemToMapDto
、次のエラーが発生します。
AutoMapper.AutoMapperMappingException:
マッピングタイプ:Tag-> TagDto DAL.Entities.Tag-> DTO.Objects.TagDto
宛先パス:ItemToMap [] [1] .Tag.Tag
ソース値:Entities.Tag ----> System.ArgumentException:同じキーを持つアイテムが既に追加されています。
マッピングは次のとおりです。
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:
問題は以下のctorにあります。ctorのコードをコメントすると、すべてが正常に機能します...
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
、すでに設定されているリゾルバーを再利用するためにキャッシュしています。つまり、マッパーをループして、の呼び出しでtrueを返すマッパーを取得しますIsMatch
。これResolutionContext
がキャッシュされているかどうかを知るために、宛先プロパティがすでに設定されているかどうか、およびコンテキストのハッシュコードをチェックします。宛先はCtorで設定されているため、Automapperはこれがキャッシュされていないと見なし、キャッシュされていないリゾルバーを呼び出します。Dictionary
後者のリゾルバーはキャッシュしますが、キャッシュリポジトリとして使用されるハッシュコードがすでに存在するため失敗します