2016-07-22 9 views
0

一般的には類似した質問がありますが、答えは見つかりませんでした。このコードブロックは、私の現在のシナリオを示すべきである:AutoMapperを使用して既存のネストされたクラスインスタンスを再利用

class Entity 
{ 
    Guid EntityId { get; set; } 
    string EntityName { get; set; } 
    NestedEntity Nested { get; set; } 
    // more domain methods 
} 

class NestedEntity 
{ 
    Guid NestedId { get; set; } 
    string NestedName { get; set; } 
    string NestedDescription { get; set; } 
    // more domain methods 
} 

class EntityDto 
{ 
    Guid EntityId { get; set; } 
    string EntityName { get; set; } 
    NestedEntityDto Nested { get; set; } 
} 

class NestedEntityDto 
{ 
    Guid NestedId { get; set; } 
    string NestedName { get; set; } 
    string NestedDescription { get; set; } 
} 

class MyMappingProfile : Profile 
{ 
    CreateMap<Entity, EntityDto>(); 
    CreateMap<NestedEntity, NestedEntityDto>(); 
} 

// that profile gets added to configuration, not shown here 
// IMapper is registered and injected as a dependency, not shown here 

EntityDto entityDto = GrabFromEntityFrameworkDbContext(); 

Entity entity = GrabChangesByUser(); 

mapper.Map<Entity, EntityDto>(entity, entityDto); 

だから、これは既存のアイテムを更新についてです、すでにユーザーが行った変更で、DBに持続しました。 EntityDtoインスタンスはEntity Frameworkから取得され、DbContextはEntityDtoNestedEntityDtoの両方の追跡を開始します。代わりにEntityインスタンスには、ユーザーによる変更が含まれています。 MVC/API PUTアクションを使用します。

mapper.Map<Entity, EntityDto>(entity, entityDto);深くEntityDtoの既存のインスタンスにEntityをクローニングするための迅速な(開発者)の方法を表します。

第1レベルのエンティティのインスタンスが実際に再利用されますが(entityDto)、ネストされたエンティティインスタンスでは同じことは起こりません。現在のテストでは、NestedEntityDtoという新しいインスタンスが作成され、EntityDtoに割り当てられています。これは、EFチェンジトラッキングを壊します。これは、同じIDで2つのネストしたエンティティインスタンスが存在するためです。

So:AutoMapperを最初のレベルの宛先オブジェクトだけでなく、ネストされたプロパティこれを達成する方法はありますか?おかげで、すべての

環境:ASP.NETコア1.0、EFコア1.0、AutoMapper 5.0.2、C#6

+0

あなたはジミーはちょうど[AutomapperとASP.NETに関する記事を書いていますあなたのための幸運なカスタム値リゾルバ –

+0

を記述する必要がありコア1](https://lostechies.com/jimmybogard/2016/07/20/integrating-automapper-with-asp-net-core-di/) –

+0

フィードバックに感謝します。はい、私はそのポストとネットコアの統合は問題ではないことを認識している、それは働いている。あなたの価値リゾルバのアイデアについてもっと詳しく説明できますか?すでにフィールドを別のフィールドに変換するために1つを使用しています。しかし、どのようにしてトップレベルの下にある既存のインスタンスを再利用できるかはわかりません。 – superjos

答えて

0

私のソリューション、当分の間、基本的にはトップレベルのクラスをマッピングするためAutoMapperを使用してドロップされる(Entity & EntityDto)、ネストされたクラスをマップするためにそれを使用し続けます。独自のプロパティを持つ多くの入れ子になったクラスがある一方で、私のシナリオでは

、トップレベルのクラスには、いくつかのプロパティを持っているので、私のがあること、怠惰バランスを手動でトップレベルのクラスをマッピングするためのカスタムマッパーを持つために私をもたらしましたインスタンスを手動で保持します。ネストされたクラスをマッピングし、必要に応じて既存のインスタンスを再利用するためには、これにはIMapperの依存関係が必要です。

もちろん、このアプローチは、トップレベルと1番目のネストされたレベルでのみインスタンスを保持することに関心があるため、機能します。さらに下のレベルでインスタンスを保存しなければならない場合は、再び機能しません。

EDIT:ヶ月後...
私は、この時間は、少なくともここSO上でいくつかの回避策を見つけることができること、同じ問題に再び計上しました。将来の読者のために:

関連する問題