使用AutoMapper

时间:2015-07-04 12:42:29

标签: c# entity-framework automapper

我在标准的分层结构中使用了以下接口和DTO:

public interface IPageView {
    IPageView Parent { get; set; }
    ICollection<IPageView> Children { get; set; }
}

这是使用以下具体类实现的:

public class PageView : IPageView {
    IPageView Parent { get; set; }
    ICollection<IPageView> Children { get; set; }
}

为简洁起见,我省略了其他属性和构造函数。我正在使用Automapper从我的Page EF POCO实体映射到界面DTO,其中包含以下内容:

AutoMapper.Mapper.CreateMap<Page, IPageView>().As<PageView>();

当AutoMapper尝试创建地图时,我收到以下异常:

  

无法映射Pipeline.CMS.Contracts.UI.IPageView上的以下属性:       网页   添加自定义映射表达式,忽略,添加自定义解析程序或修改目标类型Pipeline.CMS.Contracts.UI.IPageView。   语境:       映射到属性页面从Model.Page到Interfaces.IPageView       从System.Collections.Generic.ICollection 1[[Model.Page,Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] to System.Collections.Generic.ICollection映射到属性页1 [[Interfaces.IPageView,Interfaces,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]       从ModelPage类型映射到Interfaces.IPageView   抛出了“AutoMapper.AutoMapperConfigurationException”类型的异常。

显然这是因为AutoMapper无法映射IPageView,因为它尚未映射!

我的问题是如何解决这个问题?我不介意在AutoMapper配置中指定具体的类。

1 个答案:

答案 0 :(得分:1)

上面的代码似乎没问题且问题与层次结构无关,但是需要在原始源对象和As方法中的对象之间创建地图。对于上述情况,它将是:

AutoMapper.Mapper.CreateMap<Page, PageView>(); // Additional line here needed
AutoMapper.Mapper.CreateMap<Page, IPageView>().As<PageView>();