2

LINQ の問題が発生しました。問題を解決するためにご協力いただければ幸いです。

これが何が起こっているかです。

  1. IQueryable<LicenseEntity>リポジトリからエンティティを取得します。
  2. これらのエンティティのフィールドを確認すると、有効なデータが含まれていることがわかります。CustomerLicenseEntity には関連エンティティのフィールドがあります。LicenseEntity を使用してロードしたため、有効なデータも含まれています。
  3. .Select各 LicenseEntity を LicenseViewModel に投影するために使用します。
  4. 各 LicenseEntity に対して、LicenseEntity が渡されAutoMapper.Mapper.Map、LicenceViewModel エンティティに読み込まれます。
  5. すべてのエンティティが処理された後、デバッガーで LicenseViewModels のリストを見ると、null 参照例外が報告され、表示する項目がありません。
  6. AutoMapper が私の問題を引き起こしているかどうかを判断するために、MapMe(). MapMe の return ステートメントで停止しs、元のエンティティであるパラメーターを調べたところ、顧客フィールドが null になっていることを除いて、その中のデータは問題ないことがわかりました。それSelectは私が知らない何かをしたと思います。

Selectプロジェクションを実行しているときに、元のエンティティのすべての情報を保持するにはどうすればよいですか? 私たちのソリューションでは、リストが非常に大きくなる可能性があるため、リストを具体化できません。以下にテスト コードを記載しました。ご協力をお願いいたします。

// Get the IQueryable<LicenseEntity> list of licenses from the repository.
var list = LicenseRepository.List();

// Convert the IQueryable<LicenseEntity> to an IQueryable<LicenseViewModel>
var vmlist = list.Select(x => MapMe(x, new LicenseViewModel()));
//var vmlist = list.Select(x => AutoMapper.Mapper.Map(x, new LicenseViewModel()));

// This function was used to see the LicenseEntity that was passing into Map().
// I discovered that the entity has all the correct data except for a related
// entity field, which was present in the original LicenseEntity before         
public LicenseViewModel MapMe(LicenseEntity s, LicenseViewModel d)
{
    return d;
}

次のコードは適切に機能しますが、エンティティを具体化することはできません。

List<LicenseViewModel> vms = new List<LicenseViewModel>();
foreach (var item in list)
{
    var vm = AutoMapper.Mapper.Map(item, new LicenseViewModel());
    vms.Add(vm);
}
4

3 に答える 3

1

あなたはこれにタグを付けましLINQ-to-Entitiesたが、本文には基礎となるテクノロジーについての言及がありません。しかし、関連付けられたオブジェクトの遅延読み込みが原因で問題が発生している可能性が非常に高いです。

これは、私が扱ってきたほとんどの ORM に適用される設計上の選択です。オブジェクトをロードするとき、接続されたオブジェクトはデフォルトではロードされません。それらがデフォルトでロードされていた場合、すぐにすべてを壊してしまうことは明らかです

  • ライセンスをロードすると、関連する顧客が自動的にロードされます
  • Customer が読み込まれると、すべての関連オブジェクトが読み込まれます - 会社、住所、その他すべてのライセンスなど
  • これらのオブジェクトごとに、関連するすべてのオブジェクトがロードされます...

答えは、ロードする関連オブジェクトを指定する必要があるということです。Entity Framework では、メソッドを使用しIncludeてこれを行います。

リポジトリの抽象化を使用しているため、これが必要以上に難しいと感じるかもしれませんが、それ以上のことを知らなければ、アドバイスはできません。このタイプの機能 (かなり基本的なもの) は、リポジトリと「作業単位」パターンでは常に困難です。

于 2012-11-30T04:08:53.450 に答える
0

あなたのマッピングはもっと似ているはずだと思います:

var vms = Mapper.Map<List<LicenseEntity>, List<LicenseViewModel>>(list);

foreach(つまり、ループは必要ありません)。

しかし、残念ながら、それがあなたの問題を解決するかどうかは非常に疑わしい.

于 2012-11-30T04:15:36.817 に答える
0

ドメインエンティティをビューモデルに投影するためのソリューションを見つけました。私と同じ種類の問題に苦しんでいる場合は、次のリンクを確認してください。

http://lostechies.com/jimmybogard/2011/02/09/autoprojecting-linq-queries/ http://www.devtrends.co.uk/blog/stop-using-automapper-in-your-data-access-コード

ところで、私のドメイン エンティティの 1 つに、いくつかの「計算された」プロパティを持つ部分クラスがありました...値がデータベース レコードの他のフィールドから生成されたプロパティ。これらは、前述のソリューションに干渉するため、ドメイン エンティティに含めることはできません。それらを実際に必要な ViewModel クラスに移動しましたが、すべて問題ありません。

この情報がお役に立てば幸いです...

マイク

于 2012-12-01T07:09:27.860 に答える