AutoMapper - 压平域模型以查看模型。一个是关系很多

AutoMapper - 压平域模型以查看模型。一个是关系很多

问题描述:

我有一个复杂的领域模型,与系统中的其他实体有很多关系。AutoMapper - 压平域模型以查看模型。一个是关系很多

为了编辑这个模型,我想设置一个简化事物的视图模型。我想将模型分解成更小的逻辑块,并为每个部分编辑屏幕,而不是试图在一个屏幕上表示整个模型。

在我有一个域模型是一对多的关系它被表示如下:

public partial class CbItemsContent 
{ 

    public CbItemsContent() 
    { 
     this.cbItemsContentRegulators = new HashSet<cbItemsContentRegulator>(); 
    } 

    public int ItemContentId { get; set; } 
    public int ItemID { get; set; } 
    ...... 

    public virtual CbItem CbItem { get; set; } 
    public virtual ICollection<cbItemsContentRegulator> cbItemsContentRegulators { get; set; } 
} 

cbItemsContentRegulator是另一组实体的由CbItemsContent(上文所示的模型)

我想换成cbItemsContentRegulators的收藏在我和简化的视图模型的模型称为ItemContentRegulatorsViewModel这样的:

public class ItemContentRegulatorsViewModel 
{ 
    public int ItemContentId { get; set; } 

    public int[] RegulatorIds { get; set; } 
} 

它减少了与ItemContent父ID和int数组的关系,如果Regulator ID

是我想要做的事情吗?

如何映射我CbItemsContentRegulators收集到一个int [IDS

假设你正在使用实体框架的],你应该改变视图模型

public class ItemContentRegulatorsViewModel 
{ 
    public int ItemContentId { get; set; } 
    public IList<int> RegulatorIds { get; set; } // IList 
} 

不,你可以定义映射:

var profile = Mapper.CreateProfile("SomeName"); 
profile.CreateMap<CbItemsContent,ItemContentRegulatorsViewModel>() 
     .ForMember(dest => dest.RegulatorIds, 
      m => m.MapFrom(src => src.cbItemsContentRegulators.Select(c => c.RegulatorId))); 

现在你可以使用它在查询,如:

context.CbItemsContents.ProjectTo<ItemContentRegulatorsViewModel>() 

RegulatorIds作为一个数组,这将抛出一个异常,ToArray不被识别。