我正在使用EntityFramework作为数据层,并使用DTO在层之间传输数据。我在N-Tier架构中开发Windows Forms,当我尝试在BLL中从Entity映射到DTO时:
public IEnumerable<CategoryDTO> GetCategoriesPaged(int skip, int take, string name)
{
var categories = unitOfWork.CategoryRepository.GetCategoriesPaged(skip, take, name);
var categoriesDTO = Mapper.Map<IEnumerable<Category>, List<CategoryDTO>>(categories);
return categoriesDTO;
}
我遇到了这个错误: http://s810.photobucket.com/user/sky3913/media/AutoMapperError.png.html 错误提示我缺少类型映射配置或不支持的映射。我已经在UI层使用配置文件注册映射,方式如下:
[STAThread]
static void Main()
{
AutoMapperBusinessConfiguration.Configure();
AutoMapperWindowsConfiguration.Configure();
...
Application.Run(new frmMain());
}
而AutoMapper的配置在BLL中:
public class AutoMapperBusinessConfiguration
{
public static void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile<EntityToDTOProfile>();
cfg.AddProfile<DTOToEntityProfile>();
});
}
}
public class EntityToDTOProfile : Profile
{
public override string ProfileName
{
get { return "EntityToDTOMappings"; }
}
protected override void Configure()
{
Mapper.CreateMap<Category, CategoryDTO>();
}
}
public class DTOToEntityProfile : Profile
{
public override string ProfileName
{
get { return "DTOToEntityMappings"; }
}
protected override void Configure()
{
Mapper.CreateMap<CategoryDTO, Category>();
}
}
当从DTO映射到Entity时,我也遇到了相同的错误。
category = Mapper.Map<Category>(categoryDTO);
如何解决这个问题?
var categoriesDTO = Mapper.Map<IEnumerable<Category>, List<CategoryDTO>>(categories);
这种方式进行映射呢?使用var categoryDto = Mapper.Map<CategoryDTO>(category)
。 - walMapper.AddProfile(new EntityToDTOProfile())
而不是Mapper.Initialize
吗?从源代码来看应该没有问题,但还是试一下。同时确保在启动应用程序时能够访问到你的映射配置文件。 - walAutoMapperBusinessConfiguration.Configure();
之后,我从 DTO 到 ViewModel 调用了映射配置AutoMapperWindowsConfiguration.Configure();
。如果我删除AutoMapperWindowsConfiguration.Configure();
它就可以工作了。那么,我应该在一个类中定义它,还是有一种根据其功能在不同类中配置的方法? - WillyMapper.Initialize
。如果您查看此调用的源代码,它会调用Mapper.Reset()
,这意味着只有最后一个定义的映射会起作用。因此,请简单地删除Initialize
调用,并替换为Mapper.AddProfile< >
。 - wal