0

Automapper を使用して SQL サーバーからいくつかのデータをビュー モデルに自動投影しようとしています。

私が持っているビューモデルは次のとおりです。

public sealed class WorkstationViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OccupiedByName { get; set; }
}

そして、私が使用しようとしているコードは次のとおりです。

Mapper.CreateMap<Workstation, WorkstationViewModel>()
  .ForMember(T => T.OccupiedByName, T => T.MapFrom(W =>
    W.Sessions.AsQueryable().Select(E => E.StaffMember.Name).SingleOrDefault()));

2 つのプロパティIdとは、クラスName内で同じ名前を持っているため、自動投影されます。Workstation

このようないくつかのコードラインで発生する例外

var model = WorkstationsRepository.GetAll().Project()
           .To<WorkstationViewModel>().SingleOrDefault();

いくつかの奇妙なobject reference is null例外であり、スタック トレースの上部にいくつかのオートマッパーのCreateExpression<>メソッドがあり、オートマッパーがそれを SQL コードに変換するための適切な式を生成できないという結論が得られます。

.NameSQL テーブルから.Category.Nameの 1 項目検索などの単純なマップを使用すると、完全に機能します。必要なのは、Automapper を介してシーケンスを投影しながら、複数のアイテムにアクセスすることだけです。

4

1 に答える 1

1

新しいProject().To()API は、「従来の」API とはまったく異なるルートをMapper.Map()たどります。後者はあなたの場合に実行されると思いますが、もちろん、SQL への射影トリクルの利点はありません。

AutoMapperは関連する型から s (リフレクション)Project().To()を取得しようとしMemberInfoますが、これを使用してラムダ式を作成します。これは、マッピング内のソース プロパティがソース タイプのメンバーである必要があることを意味します。明らかに、W.Sessions.AsQueryable().Select(...のメンバーではありませんWorkstation。そのため、どこかで AutoMapper が memberinfo にぶつかりnullます。

そのためProject().To()、少し制限されています。この特定のケースでは、Sessionをその親WorkStationおよびStaffMemberモデルにマップすることで解決できます。参照ナビゲーション プロパティは で OK にマップされProject().To()ます。

于 2012-12-21T07:20:07.677 に答える