AutoMapper で EF を使用するといくつか問題が発生します。=/
例えば :
関連するエンティティが 2 つ (顧客と注文) あり、それらは DTO クラスです。
class CustomerDTO { public string CustomerID {get;set;} public string CustomerName {get;set;} public IList< OrderDTO > Orders {get;set;} }
class OrderDTO { public string OrderID {get;set;} public string OrderDetails {get;set;} public CustomerDTO Customers {get;set;} }
//when mapping Entity to DTO the code works Customers cust = getCustomer(id); Mapper.CreateMap< Customers, CustomerDTO >(); Mapper.CreateMap< Orders, OrderDTO >(); CustomerDTO custDTO = Mapper.Map(cust);
//but when i try to map back from DTO to Entity it fails with AutoMapperMappingException. Mapper.Reset(); Mapper.CreateMap< CustomerDTO , Customers >(); Mapper.CreateMap< OrderDTO , Orders >(); Customers customerModel = Mapper.Map< CustomerDTO ,Customers >(custDTO); // exception is thrown here
何か間違ったことをしているのでしょうか?
前もって感謝します !
ベストアンサー1
私が抱えていた問題は、EntityCollection 参照の更新に関連していました。AutoMapper は、DTO から Entity にマッピングするときに関係の新しいインスタンスを作成しますが、これは EF にとって好ましくありません。
私の問題を解決したのは、AutoMapper が EntityCollection プロパティの宛先値を使用するように構成したことです。あなたの場合:
Mapper.CreateMap< CustomerDTO , Customers >().ForMember(c => c.Orders, o => o.UseDestinationValue());
こうすることで、AM は新しい EntityCollection インスタンスを作成せず、元の Customer エンティティに付属しているインスタンスを使用します。
これを自動化する方法をまだ模索中ですが、今のところ問題は解決しました。