您不应该将 Mapper.CreateMap 放在您的控制器中,您只需要执行一次该操作,因此创建一个引导程序或类似的东西并从您的应用程序启动方法中调用它。
我认为这就是您的错误的来源:您只能创建一次映射。
哦,你定义了错误的类型。您并没有尝试将用户转换为 MUser,但您正在以相反的方式进行操作,所以它应该是:
Mapper.CreateMap<MUser, User>();
Mapper.Map<MUser, User>(muser);
如何执行此操作的示例:
public class MvcApplication : HttpApplication
{
// some methods
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
MappingsBootstrapper.Initialize(); // call the bootstrap class that I created
}
}
然后我有一个名为“映射”的项目,它包含引导类和一些“配置”类(就像 Entity Framework 有 EntityTypeConfiguration 类和 Ninject 有 NinjectModules):
public static class MappingsBootstrapper
{
public static void Initialize()
{
new UserMappings();
new BookcaseItemMappings();
}
}
和映射:
class UserMappings
{
public UserMappings()
{
Mapper.CreateMap<User, UserSetupViewModel>();
Mapper.CreateMap<UserSetupViewModel, User>();
}
}
class BookcaseItemMappings
{
public BookcaseItemMappings()
{
Mapper.CreateMap<NewBookViewModel, BookcaseItem>().ForMember(x => x.BookId, opt => opt.Ignore());
Mapper.CreateMap<BookcaseItem, BookcaseItemViewModel>()
.ForMember(x => x.Title, opt => opt.MapFrom(src => src.Book.Title))
.ForMember(x => x.Authors, opt => opt.MapFrom(src => src.Book.Authors.Select(x => x.Name).Aggregate((i, j) => i + ", " + j)))
.ForMember(x => x.Identifiers, opt => opt.MapFrom(src => (!string.IsNullOrEmpty(src.Book.Isbn10) ? ("ISBN10: " + src.Book.Isbn10 + "\r\n") : string.Empty) +
(!string.IsNullOrEmpty(src.Book.Isbn13) ? ("ISBN13: " + src.Book.Isbn13) : string.Empty)))
.ForMember(x => x.Pages, opt => opt.MapFrom(src => src.Book.Pages))
.ForMember(x => x.ImageUri, opt => opt.MapFrom(src => src.Book.ThumbnailUriSmall));
}
}
您可以按照自己喜欢的方式进行操作,您可以将所有映射放在 Application_Start() 方法中,但我发现这是一种干净且可维护的方式。