我试图使用automapper将EF实体映射到MVC的模型视图。在使用旧的静态版本的automapper时,我在地图上找到了很多例子,但是在进行新的基于界面的时候,没有干净的切割示例是可用的。
我的结构UserLog对象具有ApplicationUser属性,UserLog应映射到UserLogsModel
在我的 App_start 文件夹中,我有一个
public static class AutoMapperConfig
{
public static IMapper mapper;
public static void RegisterMappings()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<UserLog, UserLogsModel>()
.ForMember(d => d.Name, q => q.MapFrom(s => s.User.FirstName + " " + s.User.LastName))
.ForMember(d => d.UserName, q => q.ResolveUsing<UserNameResolver>());
});
mapper = config.CreateMapper();
var source = new UserLog();
var dest = mapper.Map<UserLog, UserLogsModel>(source);
var source2 = new List<UserLog>();
var dest2 = mapper.Map<IEnumerable<UserLog>>(source2);
config.AssertConfigurationIsValid();
}
}
然后我在相同的文件夹和命名空间中也有UserNameResolver
public class UserNameResolver : IValueResolver<UserLog, UserLogsModel, string>
{
public string Resolve(UserLog source, UserLogsModel d, string dest, ResolutionContext context)
{
return source.User.UserName;
}
}
解析器不会工作。我甚至不知道为什么UserLogsModel需要成为解析器的一部分,因为它不会向解决方案添加任何内容。有什么建议我应该怎么写这个?看来我在这里遗漏了一些核心知识。我的猜测也是AutoMapperConfig不应该像它那样。
当我将initlization更改为static并用
替换Automapperconfig时 Mapper.Initialize(cfg =>
{
cfg.CreateMap<UserLog, UserLogsModel>()
.ForMember(d => d.Name, q => q.MapFrom(s => string.Join(" ", s.User.FirstName, s.User.LastName)))
.ForMember(d => d.UserName, q => q.MapFrom(s => s.User.UserName))
.ForMember(d => d.Email, q => q.MapFrom(s => s.User.Email));
});
它有效,但仍然没有解析器