Automapper和ViewModels并将更新发布回数据库

时间:2013-05-07 13:28:23

标签: asp.net-mvc asp.net-mvc-3 entity-framework automapper

我一直认为你应该使用ViewModels(和AutoMapper) - 所以这是我最初的步骤。

我只是在寻找一些保证,我正在将我的模型映射到我的viewmodel,当发回时,我正在从返回的viewmodel正确更新数据库记录:

    //
    // GET: /Customer/EditPartial
    public ActionResult EditPartial(int id)
    {
        var customerVM = db.Customers.Where(x => x.UserName == User.Identity.Name && x.CustomerId == id).FirstOrDefault();
        AutoMapper.Mapper.CreateMap<Customer, CustomerViewModel>();
        CustomerViewModel customer = AutoMapper.Mapper.Map<Customer, CustomerViewModel>(customerVM);
        return PartialView("CustomerPartial2", customer);
    }

    //
    // POST: /Customer/EditPartial
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult EditPartial(CustomerViewModel customerviewmodel)
    {
        if (ModelState.IsValid)
        {
            Customer customer = db.Customers.Where(x => x.UserName == User.Identity.Name && x.CustomerId == customerviewmodel.CustomerId).FirstOrDefault();
            if (customer == null)
            {
                return HttpNotFound();
            }
            customer.CustomerName = customerviewmodel.CustomerName;
            customer.Email = customerviewmodel.Email;
            db.Entry(customer).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return PartialView("CustomerPartial2", customerviewmodel);
    }

那么,我的Get是否正确设置了Automapper?

我从viewmodel更新CustomerName和Email的方式是否正确,或者是否有更简单的方法再次使用AutoMapper?

谢谢,

标记

2 个答案:

答案 0 :(得分:1)

如果您正确完成了映射,那么您正确使用它。无论如何,AutoMapper都可以用于get和post。它的唯一目的是将您的一个类映射到另一个类(在您的特定情况下,将域模型映射到视图模型中,反之亦然)。如果映射是正确的(在调试器中),那么你没问题。如果没有 - 让我们知道您遇到了什么问题。

如果您不确定如何使用它,请参阅文章:Visual Studio Magazine的Simplify Your Projections with AutoMapper

这是ASP.NET MVC的另一个特定内容:Using Automapper with ASP.NET MVC application

谢谢。

答案 1 :(得分:1)

由于AutoMapper旨在简洁,我认为这段代码会更优雅:

//
    // POST: /Customer/EditPartial
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult EditPartial(CustomerViewModel customerviewmodel)
    {
        if (ModelState.IsValid)
        {
            Customer customer = db.Customers.Where(x => x.UserName == User.Identity.Name && x.CustomerId == customerviewmodel.CustomerId).FirstOrDefault();
            if (customer == null)
            {
                return HttpNotFound();
            }
            Mapper.CreateMap<CustomerViewModel , Customer>();
            Mapper.Map(customerviewmodel, customer);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return PartialView("CustomerPartial2", customerviewmodel);
    }

在您的代码中没有太多的手动属性分配,但可能会出现您需要使用您的方法键入很多内容的情况。