2017-04-05 9 views
0

私は、マッピングがあります。Automapper.ProjectTo()がnull参照例外をスローするのはなぜですか?

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<Foo, FooDto>() 
     .ForMember(dest => dest.Id, 
      opt => opt.MapFrom(src => src.Id)) 
     .ForMember(dest => dest.Name, 
      opt => opt.MapFrom(src => src.Name)) 
     .ForMember(dest => dest.PhoneNumber, 
      opt => opt.MapFrom(src => src.PhoneNumbers.Number)) //etc. 
}); 

をし、私はいくつかのアップ嘲笑EFのオブジェクトを呼び出すユニットテストでそれを使用しようとしている:

var ids = new List<string>() 
    { 
     "123"; 
     "456"; 
     "789"; 
    }; 
var data = new List<Foo>(); 
foreach(var id in ids) 
{ 
    data.Add(new Foo() { Id = id }); 
} 

this.mockContext = new Mock<entities>(); 
this.mockSet = new Mock<DbSet<Foo>>(); 
this.mockSet.As<IQueryable<Foo>>().Setup(p => p.Provider).Returns(data.Provider); 
this.mockSet.As<IQueryable<Foo>>().Setup(p => p.Expression).Returns(data.Expression); 
this.mockSet.As<IQueryable<Foo>>().Setup(p => p.ElementType).Returns(data.ElementType); 
this.mockSet.As<IQueryable<Foo>>().Setup(p => p.GetEnumerator()).Returns(data.GetEnumerator()); 

私が直接エンティティを照会:

var id = "123"; 
var bar = this.mockContext.Object.Foo.Where(p => p.id == id); 

IQueryable()が期待どおりの結果を返すようになりました。私はDTOに私のオブジェクトを投影ししようとすると、しかし:

var id = "123"; 
var buzz = this.mockContext.Object.Foo.Where(p => p.id == id).ProjectTo<FooDto>(this.config); 

私はどのような方法で結果にアクセスしようとした場合、私は取り戻すのIQueryableは、null参照例外がスローされます。したがって、たとえば:

buzz.ToList(); 
buzz.SingleOrDefault(); // This mirrors the actual call in my code since this is a GetById query. 

両方が失敗します。私はここで何が欠けていますか?

答えて

0

Fooは、EFナビゲーションプロパティを使用して他のオブジェクトを参照するという問題があります。具体的にはPhoneNumberです。テストデータはリンクされたPhoneNumberオブジェクトなしで作成されるため、ProjectToメソッド内で破損します。これはトップレベルのQueryableを直接取得する際には問題ありませんが、マッピングを完了するためにAutomapperはオブジェクトが存在する必要があります(空であっても)。その行を変更する:

data.Add(new Foo() { Id = id, PhoneNumber = new PhoneNumber() }); 

ProjectToメソッドがnull値を持つにもかかわらず、完了することができます。

関連する問題