使用Automapper进行映射后,嵌套对象成员为null

时间:2016-07-10 20:25:02

标签: c# automapper

我有一个对象

public class Tenant : EntityBase
{
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual string CreatorName { get; set; }
    public virtual TenantState State { get; set; }
    public virtual Address Address { get; set; }

    public virtual IList<TenantActivity> Activities { get; set; }
    public virtual IList<AppUser> Users { get; set; }
    public virtual IList<TenantConfig> TenantConfigs { get; set; }

    ....
}

像这样的DTO:

public class TenantDto
{
    public Guid Id { get; set; }
    public DateTime CDate { get; set; }
    public string CUser { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string CreatorName { get; set; }
    public TenantState State { get; set; }
    public AddressDto Address { get; set; }
    public List<TenantActivityDto> Activities { get; set; }
    public List<AppUserDto> Users { get; set; }
    public List<TenantConfigDto> TenantConfigs { get; set; }
    ....
}

Address是一个ValueObject,它也有一个DTO。我使用以下映射(标准,没有特殊配置)

public class TenantMapperProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<Tenant, TenantDto>();
        CreateMap<TenantDto, Tenant>();
    }
}

public class AddressMapperProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<Address, AddressDto>();
        CreateMap<AddressDto, Address>();
    }
}

在我的App.xaml.cs中,我有:

        var mapperConfig = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<TenantMapperProfile>();
            cfg.AddProfile<TenantActivityMapperProfile>();
            cfg.AddProfile<AppUserMapperProfile>();
            cfg.AddProfile<AddressMapperProfile>();
            //cfg.ShouldMapProperty = p => p.SetMethod.IsPrivate || p.GetMethod.IsAssembly;
        });
        Mapper = mapperConfig.CreateMapper();

然后我在这样的服务中称呼它:

    public TenantDto CreateTenant(TenantDto tenantDto)
    {
        tenantDto.CreatorName = creatingUserName;
        var tenant = _mapper.Map<Tenant>(tenantDto); 
        tenant = _tenantManagerService.CreateTenant(tenant);//<-- Screenshot made here
        return _mapper.Map<TenantDto>(tenant);
    }

第一次调用mapper后,我制作了调试器窗口的截图。如您所见,tenantDto实例包含Address对象中的数据,但tenant对象包含正确映射的自己的数据,但嵌套的Address对象只有空值!我在这做错了什么?

编辑 - 其他信息

调用mapperConfig.AssertConfigurationIsValid();会返回一个错误:

  

Bedisoco.BedInventory.Sys.Models.Entities.Role上的以下属性无法映射:       角色   添加自定义映射表达式,忽略,添加自定义解析程序或修改目标类型Bedisoco.BedInventory.Sys.Models.Entities.Role。

Role对象位于其中一个列表中,我认为User集合中的List<AppUser>对象包含Role个对象列表。它甚至没有完全实现。

我错了,假设Automapper无声地忽略了这些事情 ??

enter image description here

1 个答案:

答案 0 :(得分:3)

好的解决了,这是我自己的问题。

我的大多数值对象都包含一个包含所有字段和私有setter的构造函数。如果配置正确(cfg.ShouldMapProperty = p => p.SetMethod.IsPrivate || p.GetMethod.IsAssembly;),私有设置器对Automapper没有问题。

但是VS或ReSharper建议使自动属性“只获得”。这个重构令VS高兴,但不是Automapper!