Automapper null属性

And*_*kov 10 c# automapper

我使用Automapper将对象映射到dtos.

public class OrderItem : BaseDomain
{
    public virtual Version Version { get; set; }
    public virtual int Quantity { get; set; }
}




[DataContract]
[Serializable]
public class OrderItemDTO
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Guid { get; set; }
    [DataMember]
    public virtual int? VersionId { get; set; }
    [DataMember]
    public virtual string VersionName { get; set; }
    [DataMember]
    public virtual int Quantity { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

因此,当我使用null版本的OrderItem时,我得到一个例外:

 Mapper.Map<OrderItem, OrderItemDTO>(item)

 Missing type map configuration or unsupported mapping.
Run Code Online (Sandbox Code Playgroud)

Jak*_*sen 23

如果没有看到你的映射代码,很难确切地说出了什么问题,但我的猜测是你用类似下面的代码映射你的类型:

Mapper.CreateMap<OrderItem, OrderItemDTO>()
      .ForMember(dest => dest.VersionId, options => options.MapFrom(orderitem => orderitem.Version.VersionId))
      .ForMember(dest => dest.VersionName, options => options.MapFrom(orderitem => orderitem.Version.VersionName))
      ;
Run Code Online (Sandbox Code Playgroud)

如果OrderItem.Version为null ,则上面的代码将失败.为了防止这种情况,您可以在传递给的代理中检查null ForMember:

Mapper.CreateMap<OrderItem, OrderItemDTO>()
      .ForMember(dest => dest.VersionId, options => options.MapFrom(orderitem => orderitem.Version == null ? (int?) null : orderitem.Version.VersionId))
      .ForMember(dest => dest.VersionName, options => options.MapFrom(orderitem => orderitem.Version == null ? null : orderitem.Version.VersionName))
      ;
Run Code Online (Sandbox Code Playgroud)

  • @Jordan:当您创建自己的映射以展平结构时,如上例中使用lambda"orderitem => orderitem.Version.VersionId"并且orderitem.Version为null,AutoMapper无法检测到存在lambda中的问题. (6认同)
  • 我认为automapper足够聪明,可以处理null属性 (3认同)