2

私のソリューションには、ASP.NET MVC3 プロジェクトと、データベースで動作する WCF プロジェクトがあります。オブジェクトのマッピングにはentity framework self trackingとを使用します。AutoMapper

私の質問はAutoMapper、クレートや削除、編集メソッドなどのポストアクションでどのように使用できるかです

私はこの質問を見ましたが、私を助けませんこれは私にエラーを与えますargument type '...' is not assignable to parameter type '...'

      [HttpPost]
      public ActionResult Create(MUser muser)
      {
        if (ModelState.IsValid)
        {
            Mapper.CreateMap<User, MUser>();
            var user = Mapper.Map<User, MUser>(muser);
            _proxy.SaveUser(user);
            return RedirectToAction("Index");

        }
        return View(muser);
      }

ここに画像の説明を入力

4

1 に答える 1

9

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() メソッドにすべてのマッピングを配置することもできますが、これはクリーンで保守しやすい方法であることがわかりました。

于 2012-05-22T11:12:36.983 に答える