2016-06-16 34 views
0

このようにネストされた子プロパティをマップしようとしています。ネストされたデスティネーションのあるAutomapperプロパティ

var mapperConfig = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<Collection, CollectionDTO>() 
     .ForMember(dest => dest.Items.Select(x => x.AddedToCollectionDate), 
           opts => opts.MapFrom(src => 
            src.CollectionItems.Select(ci => ci.AddedToCollectionDate))); 

}); 

Collection.ItemsList<Item>です。各ItemにはAddedToCollectionDateというプロパティがあり、ソースマッピングから移入する必要があります。

CollectionDTOは、CollectionItemと呼ばれるクロス結合テーブルに対してナビゲーションプロパティを持ちます。このプロパティは、AddedToCollectionDateというプロパティを持ちます。

エラー:

Custom configuration for members is only supported for top-level individual members on a type.

どのように私はAutoMapperでこれを達成することができますか?

Clases(簡潔にするために他のプロパティを省略):

public partial class Collection 
{ 
    public virtual ICollection<CollectionItem> CollectionItems { get; set; } 
} 

public partial class CollectionItem 
{ 
    public System.DateTime AddedToCollectionDate { get; set; } 

    public virtual Collection Collection { get; set; } 
    public virtual Item Item { get; set; } 
} 

public class CollectionDTO 
{ 
    public List<ItemDTO> Items { get; set; }  
    public DateTime LastAccessedDate { get; set; } 
} 

public class Item 
{ 
    public DateTime LastAccessedDate { get; set; } 
    public virtual ICollection<CollectionItem> CollectionItems { get; set; } 
} 
+0

質問: 'CollectionItem'と' Items'は同じ型ですか? – octavioccl

+0

いいえ、 'Collection'テーブルは' Item'への 'CollectionItem'(相互参照テーブル)への参照を持っています。 'Collection'と' Item'には多対多の関係があります。私の 'Item'オブジェクトに移入された' CollectionItem'テーブルから 'AddedToCollectionDate'プロパティが必要です。 – duyn9uyen

+0

しかし、あなたのDTOで同じ型のデータモデルを使用しているのでしょうか違うのですか?質問にクラスを追加してください。 – octavioccl

答えて

0

代わりForMemberコールの、あなたにもCollectionItemのマッピングを設定する必要があります。

cfg.CreateMap<CollectionItem, ItemDTO>(); 
cfg.CreateMap<Collection, CollectionDTO>(); 

あなたもCollectionDTO.ItemsCollectionDTO.CollectionItemsにAutoMapperの名前を変更する場合は、CollectionDTOで右コレクションにCollection.CollectionItemsをマッピングするために十分知っています。

+0

それは私にとってはうまくいかなかった。しかし、ありがとう。 – duyn9uyen

+0

重要な情報を忘れました。 –

1

このようにしてSelect()の代わりにFirstOrDefault()を実行すると、動作するようになりました。

cfg.CreateMap<Item, ItemDTO>() 
        .ForMember(dest => dest.AddedToCollectionDate, 
           opts => opts.MapFrom(src => 
            src.CollectionItems.FirstOrDefault().AddedToCollectionDate)); 
関連する問題