22

AutoMapper で EF を使用すると問題が発生します。=/

例えば ​​:

関連する 2 つのエンティティ ( Customers と Orders ) があり、それらは 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

私は何か間違ったことをしていますか?

前もって感謝します !

4

8 に答える 8

20

私が抱えていた問題は、EntityCollection 参照の更新に関連していました。AutoMapper は、DTO からエンティティへのマッピング時に関係の新しいインスタンスを作成しますが、これは EF を喜ばせません。

私の問題を解決したのは、EntityCollection プロパティの宛先値を使用するように AutoMapper を構成することでした。あなたの場合:

Mapper.CreateMap< CustomerDTO , Customers >().ForMember(c => c.Orders, o => o.UseDestinationValue());

そうすれば、AM は新しい EntityCollection インスタンスを作成せず、元の Customer エンティティに付属しているものを使用します。

これを自動化する方法についてはまだ取り組んでいますが、今のところ問題は解決しています。

于 2010-05-28T17:59:19.400 に答える
6

既存のオブジェクトへのマッピングを試してください:

entity = Mapper.Map<MyDTO, NyEntity>(dto, entity); 

Ignore() を所定の位置に保持します。

http://groups.google.com/group/automapper-users/browse_thread/thread/24a90f22323a27bc?fwc=1&pli=1

于 2011-12-29T15:32:55.590 に答える
5

あなたの問題は、Automapper がレコードに関連付けられた EntityKey を失うためです。EntityFramework はデフォルトで POCO (Plain Old CLR Object) を処理しないため

Jay Zimmerman は、これをどのように処理するかの良い例を示しています。gd /4NIcj また、Jaroslaw Kowalski (私が信じている EF チームの一員) から、EF 内で POCO を使用するためのこの例があり、これは Automapper で使用するのに適切に変換される可能性があります (私はまだ試す機会がありませんでした): http:/ /blogs.msdn.com/jkowalski/archive/2008/09/09/persistence-ignorance-poco-adapter-for-entity-framework-v1.aspx

于 2009-11-05T14:54:34.167 に答える
2

AutoMapper は、マッピング エラーに関して非常に表現力があります。例外メッセージを注意深く読んでください。

もう 1 つの重要なことは、Mapper.AssertConfigurationIsValid(); を呼び出すことを忘れないことです。マッピングを作成した後。マッピングが間違っているとエラーが発生するため、後でアプリケーションの実行時に例外が発生するのを防ぐことができます。

于 2009-10-18T17:09:50.327 に答える
2

次のようないくつかのエンティティ プロパティのマッピングを無視する必要があります。

Mapper.CreateMap<CustomerDto, Customer>()
                .ForMember(dest => dest.EntityKey, opt => opt.Ignore())
                .ForMember(dest => dest.Licenses, opt => opt.Ignore())
                .ForMember(dest => dest.AccessCodes, opt => opt.Ignore());

Automapper によってスローされた例外からのメッセージを調べると、マッピングできないエンティティ プロパティが表示され、上記のように無視されます。

于 2011-10-07T15:29:42.503 に答える
0

ここで読むことができるように、次のことを行う必要があります

AutoMapper を使用してエンティティを更新できます。方法は次のとおりです。DTO とエンティティ オブジェクトの両方を AutoMapper の Map メソッドに渡します。それがこのコードが行うことです:

custExisting = Mapper.Map(Of CustomerDTO,  Customer)(custDTO, custExisting)

ここで説明されているようなマッピングの問題にも注意してください

これらのヒントは私にとって役に立ちました。

于 2014-01-18T20:17:59.167 に答える