ASP.Net MVC Viewmodels如何将视图模型中的值映射到数据库表

Mar*_*ark 2 c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我正在尝试使用ViewModels和AutoMapper,因为我知道这些是避免许多问题的最佳实践.

我可以使用AutoMapper来填充视图模型,但是我不确定如何更新我的数据库,从ViewModel发回到我的控制器.

我的GET是:

        public ActionResult Edit(int id = 0)
        {
        Customer customer = db.Customers.Find(id);
        var offers = db.Offers.Where(x => x.CustomerId == id).ToList();
        var email = db.Emails.FirstOrDefault();
        var vm = new CreateViewModel();

        vm.CustomerId = customer.CustomerId;
        vm.ArrivalDate = customer.ArrivalDate;
        vm.CustomerName = customer.CustomerName;
        vm.EmailAddress = customer.EmailAddress;
        vm.NumNights = customer.NumNights;
        vm.NumPeople = customer.NumPeople;

        vm.EmailBody = email.EmailBody;
        vm.From = email.From;
        vm.Subject = email.Subject;

        // Map list of Offers into ViewModel
        vm.Offers = Mapper.Map<IList<Offer>, IList<OfferVM>>(offers);
        return View(vm);
       }
Run Code Online (Sandbox Code Playgroud)

我的帖子是:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(EditViewModel vme)
    {
        if (ModelState.IsValid)
        {
            // Update the Customer properties
            Customer customer = db.Customers.Find(vme.CustomerId);
            customer.NumPeople = vme.NumPeople;
            customer.NumNights = vme.NumNights;
            customer.ArrivalDate = vme.ArrivalDate;
            customer.CustomerName = vme.CustomerName;
            customer.EmailAddress = vme.EmailAddress;

            // Update Offers table
            foreach (var o in vme.Offers)
            {
                // find the offer 
                Offer offer = db.Offers.Find(o.OfferId);
                if (offer != null)
                {
                    // update the properties of Offer
                    offer.RoomRate = o.RoomRate;
                    offer.IncludeInOffer = o.IncludeInOffer;
                }
            }

            db.SaveChanges();

            return RedirectToAction("Index");
        }
        return View(vme);
    }
Run Code Online (Sandbox Code Playgroud)

所以我的帖子是手动更新两个数据库表(优惠和客户).

GET方法很优雅,使用AutoMapper,POST不是.我想知道是否有更简单的方法通过AutoMapper更新数据库,而无需手动浏览我想要更新的每个属性?或者我的POST控制器是否尽可能高效?

谢谢你的任何指示,

标记

Jot*_*aBe 5

Map的重载允许将属性映射到一个预先存在的实例:

Mapper.Map<IObjectA, IObjectB>(objectA, ObjectB);
Run Code Online (Sandbox Code Playgroud)

因此,您只需要从参数vme(CreateViewModel vme)映射到customer从DB恢复.这也适用于优惠部分.

当然,您必须以相反的方向配置映射:您已经从db对象到视图模型完成了映射,现在需要将它们从viewmodel映射到db对象.如果您遵循Automapper惯例,它将非常简单甚至是不必要的.

编辑: Henk Mollema添加了有趣的评论

您可以将AutoMapper配置为忽略属性,如果ViewModel不包含域模型中的所有属性(很可能是这种情况),则不会使用空值覆盖它们.