1

AutoMapperをバージョン2に更新しましたが、現在多くの問題が発生しています...

私はリストを持っています、ItemToMapそしてこれらのオブジェクトのすべては同じオブジェクトへの参照を持っていますTag

でマップしようとするItemToMapItemToMapDto、次のエラーが発生します。

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後者のリゾルバーはキャッシュしますが、キャッシュリポジトリとして使用されるハッシュコードがすでに存在するため失敗します

4

2 に答える 2

3

これはバグです。修正はリリース2.2.1にあります

于 2012-11-23T14:03:48.630 に答える
1

あなたは登録する必要がありますDAL.Entities.Tag、そしてDTO.Objects.TagDtoあなたはTagとTagDtoに同じプロパティ名を持っていますが

Tagマッピングしていないクラスのプロパティのいくつかを推測します。もしそうなら使用Ignore

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

HereHereHereをご覧ください

于 2012-10-26T03:16:42.637 に答える