データベースから次のデータが返されました。
Number, AddressStreet, AddressCity, AddressState
私のドメイン オブジェクトは次のとおりです。
public class Order
{
public Address Address { get; set; }
public String Number { get; set; }
}
public class Address
{
public String City { get; set; }
public String State { get; set; }
public String Street { get; set; }
}
組み込みの DataReaderMapper を使用すると、データベース データを含む IDataReader からのマッピングは簡単ですが、Address オブジェクトに値を設定することはできません。
理想的には、次のように DynamicMap を使用したいと思います。
var order = Mapper.DynamicMap<Order>(dataReader);
これを行うと、order.Number が入力されますが、order.Address は null です。Order コンストラクターで Address クラスの新しいインスタンスを作成すると、(予想どおり) null ではありませんが、どのプロパティも設定されていません。
私はもう試した:
Mapper.CreateMap<IDataReader, Order>()
.ForMember(target => target.Address, opt => opt.MapFrom(src => src));
列名を単純な「Street」、「City」、および「State」に変更しましたが、うまくいきませんでした。
私はもう試した:
Mapper.CreateMap<IDataReader, Address>();
Mapper.CreateMap<IDataReader, Order>()
.ForMember(target => target.Address, opt => opt.UseDestinationValue());
およびそれらのすべての組み合わせ。Address の各プロパティに ForMembers も指定しました。何も機能していません。
AutoMapper が慣例による平坦化をサポートしていることは知っていますが、慣例による射影 (AddressStreet を Address.Street にマップする必要があることを認識している場合) が不可能であることを発見したことから推測することしかできません。私が間違っている?
上記の例を機能させるにはどうすればよいですか???
アップデート
以下を使用して動作させることができました。
Mapper.CreateMap<IDataReader, Order>()
.ForMember(target => target.Address,
opt => opt.MapFrom(src => Mapper.Map<Address>(src)));
ちょっとゴツく見えるけど。