Mapper.CreateMap をコントローラーに配置しないでください。そのアクションを 1 回だけ実行する必要があるため、ブートストラップなどを作成し、アプリケーションの開始メソッドから呼び出します。
それがあなたのエラーの原因だと思います.マッピングは一度しか作成できません.
ああ、あなたは間違った型を定義しています。User を 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
}
}
次に、'Mappings' というプロジェクトを作成しました。これには、ブートストラップ クラスといくつかの '構成' クラスが含まれています (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() メソッドにすべてのマッピングを配置することもできますが、これはクリーンで保守しやすい方法であることがわかりました。