2

ViewModels と AutoMapper を使用しようとしていますが、これらは多くの問題を回避するためのベスト プラクティスであることがわかっています。

AutoMapper を使用してビューモデルにデータを入力しても問題ありませんが、コントローラーにポストされたビューモデルからデータベースを更新する方法についてはよくわかりません。

私の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);
       }

私の投稿は:

    [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);
    }

したがって、私の投稿は 2 つのデータベース テーブル (Offers と Customers) を手動で更新しています。

AutoMapper を使用する GET メソッドは洗練されていますが、POST はそうではありません。更新しようとしている各プロパティを手動で確認する必要なく、AutoMapper を介してデータベースを更新するより簡単な方法があるかどうか疑問に思っています。または、私の POST コントローラーは可能な限り効率的ですか?

ご指摘ありがとうございます。

マーク

4

2 に答える 2

5

プロパティを 1 つの既存のインスタンスにマップできる Map のオーバーロードがあります。

Mapper.Map<IObjectA, IObjectB>(objectA, ObjectB);

したがって、パラメーターvme( CreateViewModel vme) からcustomerDB から復元された にマップするだけです。これはオファー部分にも当てはまります。

もちろん、マッピングを逆方向に構成する必要があります。db オブジェクトからビュー モデルに設定しましたが、今度はそれらをビューモデルから db オブジェクトにマッピングする必要があります。Automapper の規約に従っている場合、それは非常に簡単であるか、不要ですらあります。

EDIT: Henk Mollemaによる興味深いコメントを追加

プロパティを無視するように AutoMapper を構成できます。ViewModel にドメイン モデルのすべてのプロパティが含まれていない場合 (ほとんどの場合)、null で上書きされません。

于 2013-07-10T09:15:32.990 に答える