我正在尝试使用 Automapper Queryable Extensions,但我遇到了映射子引用类型属性的问题,这些属性在源对象上为空。
基本上,如果我们有这个:
public class Foo
{
public int Id { get; set; }
public String Name { get; set; }
public virtual Bar Bar { get; set; }
}
public class Bar
{
public int Id { get; set; }
public String Name { get; set; }
}
public class FooDTO
{
public int Id { get; set; }
public String Name { get; set; }
public virtual BarDTO Bar { get; set; }
}
public class BarDTO
{
public int Id { get; set; }
public String Name { get; set; }
}
我们尝试如下投影:
// Arrange
Mapper.CreateMap<Foo, FooDTO>();
Mapper.CreateMap<Bar, BarDTO>();
var bar = new Bar { Id = 1, Name = "bar" };
var foo = new Foo { Id = 1, Name = "foo" };
var bie = new Bar { Id = 2, Name = "bie" };
var noo = new Foo { Id = 1, Name = "noo", Bar = bie };
var foobar = new List<Foo> { foo, noo }.AsQueryable();
// Act
var foobarProjection = foobar.Project().To<FooDTO>().ToList();
引发 NullReferenceException(因为“foo”对象具有空 Bar 属性)。如果“foo”对象设置了 Bar 属性,则不会引发异常。
如果我按如下方式更改 FooDTO 类:
public class FooDTO
{
public int Id { get; set; }
public String Name { get; set; }
public virtual Bar Bar { get; set; }
}
(换句话说,我已将 Bar 属性更改为 Bar 类型,而不是 BarDTO),然后我没有得到空引用异常并且一切正常。