3

最初にEFコードを使用するRESTスタイルのWebアプリケーションがあります。AutoMapperを使用して、クラスをDTOクラスにマップし、ネットワークを通過させて(うまくいけば)元に戻します。

POCOクラスからDTOにマップするとき、実際にはEFプロキシオブジェクトから始めています。これは、処理しているオブジェクトが、に対して何らかのクエリを実行した結果であるためDataContextです。ただし、これは問題なく機能するようです。

POSTリクエストの一部としてDTOクラスを取得すると、AutoMapperを使用してそれをPOCOクラスにマッピングできますが、これも問題なく機能します。

ただしCreate、AutoMapperはのメソッドを使用するのではなくPOCOオブジェクトをnew()するだけなEntitySetので、対応するEFプロキシクラスではなくPOCOクラスがあります。これにより、データベースなどにデータを追加するのが難しくなります。

AutoMapperを使用するように説得するにはどうすればよいEntitySet.Createですか?または、同じ結果を達成する別の方法はありますか?

4

3 に答える 3

3

Map.CreateMap新しいオブジェクトのファクトリメソッドとして使用できる関数を受け入れるIMappingExpressionメソッドを持つオブジェクトを作成します。ConstructUsingマップされたプロパティは、値を設定するために使用されます。(ちなみに、これはによってオーバーライドできますConvertUsing)。

詳細については、Automapper-プロパティセッターの代わりにコンストラクターパラメーターにマップする方法、間違ったコンストラクターを使用するAutoMapper 、またはデフォルトのコンストラクターなしでオブジェクトを構築するためにAutomapperを使用する方法を参照してください

あなたの場合、これは次のようになります。

Mapper.CreateMap<TDto, TPoco>()
    .ConstructUsing((Func<TDto, TPoco>) (c => context.CreateObject<TPoco>()))
于 2012-08-16T20:36:42.410 に答える
1

あなたはこのようにできるかもしれません、

最初に必要なオブジェクトを作成し、次にそのインスタンスを使用してDTOオブジェクトをマップします。

var poco=EntitySet.Create()

Mapper.Map<DTOtype, POCOtype>(dto, poco); 
于 2012-08-07T03:36:44.493 に答える
0

DTOのよ​​うに、postメソッドでPOCOオブジェクトを受け入れているとします。

[HttpPost]
public ActionResult Save(Student std)
{
    //do the stuff
}

StudentがEFプロキシクラスであると仮定しますが、Modelbinderを使用してフォーム値にバインドすると、データコンテキストに関連付けられたオブジェクトではなく新しいオブジェクトが作成されます。つまり、最初に、ポストでDTOを受け入れてから、それらをプロキシクラスに変換するか、最初にプロキシクラスを受け入れるかに違いはありません。2つ目は、オブジェクトがデータベースにすでに存在し、automapperを使用してオブジェクトを作成したばかりの場合、 attachメソッドを使用してdatacontextに関連付けることができるということです。新しいオブジェクトの場合は、Addメソッドを呼び出してデータベースに保存する必要があります。

于 2012-08-07T05:31:09.200 に答える