2016-07-10 121 views
3

映射之後空我有一個對象嵌套對象成員與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。我用下面的映射(標準,無特殊CONFIGS)

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); 
    } 

第一次調用映射器之後,我製作了一個調試器窗口的截圖。如您所見,tenantDto實例包含Address對象中的數據,但tenant對象包含自己的正確映射的數據,但嵌套的Address對象只有空值!我在這裏做錯了什麼?

編輯 - 其他信息

調用mapperConfig.AssertConfigurationIsValid();返回一個錯誤:

The following property on Bedisoco.BedInventory.Sys.Models.Entities.Role cannot be mapped: Roles Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type Bedisoco.BedInventory.Sys.Models.Entities.Role.

Role對象是裏面的名錶之一的地方,我覺得List<AppUser>集合內User對象包含本身Role對象列表。它甚至沒有完全實施。

我錯了,假設Automapper默默地忽略了這樣的事情 ??

enter image description here

+0

嘗試在調用'CreateMapper'之前添加'mapperConfig.AssertConfigurationIsValid();'。如果你沒有給automapper足夠的信息,它應該會失敗。 – Eris

+0

您還需要爲CreateMap ();'等內部實體創建'CreateMap'。 – Yogi

+0

我這樣做了,我沒有在這裏粘貼十幾個配置文件類。我已經更新了一切,'AssertConfigurationIsValid()'不再拋出任何異常。但是我的'Address'對象在mapper調用後仍然只包含NULL值。這以數據庫中的不允許NULL值的字段的異常結束。 – ThommyB

回答

3

好的解決了這個問題,是我自己的問題。

我的大部分值對象都包含一個包含所有字段和私有setter的構造函數。如果配置正確,私人設置者對於Automapper沒有問題(cfg.ShouldMapProperty = p => p.SetMethod.IsPrivate || p.GetMethod.IsAssembly;)。

但VS或ReSharper建議使汽車屬性'只能'。這個重構請VS,但不是Automapper!