11

オブジェクト間のマッピング (PersonModel から PersonViewModel など) を行う必要があり、これを行うためのさまざまなアプローチについて調査しています。具体的には、Entity Framework を使用して、生成されたモデルをビューモデルにマップしようとしています。

ただし、これを行う方法のリストをまとめた記事やリソースはまだ見つけていません。これまでのところ、私は以下に出くわしました:

  • 暗黙の変換 (これが最も基本的なアプローチだと思いますか?あるオブジェクトから別のオブジェクトにプロパティを手動でマップするため、単純ですが面倒です)
  • 拡張メソッド (これはまだ使用していません)
  • リフレクション (少しいじりましたが、非常に基本的なマッピングしか管理できませんでした)
  • Automapper (非常に人気がありますが、EF でうまく動作させるのに苦労しています)
  • Value Injecter (これはまだ使用していません)
  • エミット マッパー (まだこれを使用したことはありませんが、おそらく EF で使用するには問題があるでしょうか?)

そこで利用可能なアプローチと、それぞれの長所/短所を指摘して詳しく説明してください。たとえば、Automapper は手動マッピングに比べて遅いと言う人を見ましたか? または、これに取り組む記事を指摘してください。

編集: AutoMapper でどのような問題があるかを尋ねる人もいるかもしれないので、これを参照してください: Automapper: IList を EntityCollection にマップする方法

4

2 に答える 2

5

さて、独自のマッピングを行う方法を紹介します。非常に簡単に行うことができ、大量のデータに対してすばやく実行できます。私が何をするかを示してから、なぜ私が何をするのかを詳しく説明します。ここに行きます:

public class PersonViewModel
{
    public static Expression<Func<Person, PersonViewModel>> FromPerson
    {
        get
        {
            return p => new PersonViewModel
            {
                Name = p.FirstName,
                SurName = p.LastName
            };
        }
    }

    public string Name { get; set; }
    public string SurName { get; set; }
    public static PersonViewModel CreateViewModel(Person original)
    {
        var func = FromPerson.Compile();
        var vm = func(original);

        return vm;
    }
}

Person EF モデルから ViewModel に変換する方法が 2 つあります。これは、Expression> を使用する最初のものは、Select() ステートメントで大量のオブジェクトを変換するために使用されるためです。簡単な使い方:

return people.Select(PersonViewModel.FromPerson);

この場合、おそらく DB から Person オブジェクトのコレクションを取得し、それらをたとえばリストなどで表示する必要がありますが、ViewModel を使用しています。このように、操作は一括して実行され、他の方法ですべてのオブジェクトを単純に作成するよりもはるかに高速です。これで、静的な CreateViewModel メソッドを使用して、必要に応じて単一のオブジェクトをマップできるようになりました。たとえば、DB から単一のユーザーのデータを取得し、それを表示する必要があるが、ViewModel を使用している場合です。その場合、主に一括変換用の式ではなく、静的メソッドを使用するのが適切です。

AutoMapper を使用することの何が問題なのか疑問に思うことは別として、それは私が提供できることです。AutoMapper は非常に簡単であり、EF と一緒に使用することの問題点について詳しく説明していないからです。これがあなたの問題に少なくとも少し役立つことを願っています:)

于 2016-08-19T14:16:30.197 に答える