2

在我的解决方案中,我有一个 ASP.NET MVC3 项目和一个与数据库一起使用的 WCF 项目。我使用entity framework self trackingandAutoMapper来映射对象。

我的问题是:我如何使用AutoMapper诸如 crate 和 delete 以及 Edit 方法之类的 Post Action

我看到了这个问题,但没有帮助我,这给了我一个错误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 放在您的控制器中,您只需要执行一次该操作,因此创建一个引导程序或类似的东西并从您的应用程序启动方法中调用它。

我认为这就是您的错误的来源:您只能创建一次映射。

哦,你定义了错误的类型。您并没有尝试将用户转换为 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() 方法中,但我发现这是一种干净且可维护的方式。

于 2012-05-22T11:12:36.983 回答