2011-03-07 135 views
0

我想用AutoMapper將一個id映射到對象上,我一直試圖弄清楚這兩天。任何幫助,將不勝感激。映射一個可爲空的實體

這裏是我的域對象:

public class Entity 
{ 
    public virtual Guid Id { get; protected set; } 
} 

public class Customer : Entity 
{ 
    public virtual User SalesPerson { get; set; } 
} 

public class User : Entity 
{ 
    public virtual string Email { get; set; } 
} 

這裏是我使用的編輯模式。銷售人員是具有「無」選項(value="")的用戶的下拉列表,因爲客戶可能沒有銷售人員。

public class CustomerEditModel 
{ 
    [DisplayName("Sales Person")] 
    public Guid? SalesPerson { get; set; } 
} 

而這裏是我卡住的地方。這是到目前爲止,我已經嘗試到編輯模式映射回域模型的映射:

cfg.CreateMap<CustomerEditModel, Customer>() 
    .ForMember(d => d.SalesPerson, o => o.ResolveUsing<EntityResolver<User>>().FromMember(s => s.SalesPerson)); 

cfg.CreateMap<CustomerEditModel, Customer>() 
    .ForMember(d => d.SalesPerson, o => o.MapFrom(s => s.SalesPerson.HasValue ? s.SalesPerson.Value : null); 

cfg.CreateMap<CustomerEditModel, Customer>() 
    .ForMember(d => d.SalesPerson, o => o.MapFrom(s => s.SalesPerson != null ? s.SalesPerson : null)); 

public class EntityResolver<T> : ValueResolver<Guid, T> 
    where T : Entity 
{ 
    protected override T ResolveCore(Guid source) 
    { 
     return session.Get<T>(source, LockMode.None); 
    } 
} 

回答

0

我做了以下修改,事情似乎按預期工作。

public class EntityResolver<id, entity> : ValueResolver<id, entity> 
    where entity : Entity 
{ 
    protected override entity ResolveCore(id source) 
    { 
     if (source != null) 
      return session.Get<entity>(source, LockMode.None); 
     else 
      return null; 
    } 
} 

...

cfg.CreateMap<CustomerEditModel, Customer>() 
    .ForMember(d => d.SalesPerson, o => o.ResolveUsing<EntityResolver<Guid?, User>>().FromMember(s => s.SalesPerson)); 
+0

你也可以使用一個類型轉換器,以及: Mapper.CreateMap .ConvertUsing >(); EntityConverter是一個ITypeConverter,看起來幾乎和上面一樣。 –