1

I am developing an MVC application which and I'm not clear on the ideal way to save these entities. What I am doing now works but is nasty to say the least.

My action method takes ViewModels and uses Automapper to map them to the related entities. My entities are Requestor, Order and OrderDetail.

Obviously all these calles to the SaveChanges method are wrong but I have been running into issues of new children being added instead of updated amongst other things.

Any help on how this code should look would really be appreciated.

Jason MacKenzie

 [HttpPost]
    public ActionResult Edit(FormCollection formValues, RequestorViewModel requestor, OrderViewModel order, List<OrderDetailViewModel> OrderDetails)
    {

        var query = from r in db.Requestors
                    where r.RequestorID == requestor.RequestorID
                    select r;
        var req = query.SingleOrDefault();

        var orderQuery = from o in db.Orders
                         where o.RequestorID == requestor.RequestorID
                         select o;
        var or = orderQuery.SingleOrDefault();


        List<OrderDetail> orDet = db.OrderDetails.Where(od => od.OrderID == or.OrderID).ToList();


        Mapper.CreateMap<RequestorViewModel, Requestor>();
        req = Mapper.Map<RequestorViewModel, Requestor>(requestor);

       Mapper.CreateMap<OrderViewModel, Order>();
       or = Mapper.Map<OrderViewModel, Order>(order);

       Mapper.CreateMap<OrderDetailViewModel, OrderDetail>();
       orDet = Mapper.Map<List<OrderDetailViewModel>, List<OrderDetail>>(OrderDetails);

       foreach (OrderDetail od in orDet)
       {
           db.OrderDetails.ApplyCurrentValues(od);
           db.SaveChanges();

       }

        db.Requestors.ApplyCurrentValues(req);
        db.SaveChanges();

        db.Orders.ApplyCurrentValues(or);
        db.SaveChanges();



        return View("Index");
    }
  • 1
    This can be helpful: http://stackoverflow.com/questions/3594515/how-to-update-an-entity-in-entity-framework-4-net/3594608#3594608 For working with relations also check this: http://stackoverflow.com/questions/3635071/update-relationships-when-saving-changes-of-ef4-poco-objects/3635326#3635326 – Ladislav Mrnka Mar 16 '11 at 15:38
  • `Amongst other things` - care to elaborate? – Yakimych Mar 16 '11 at 17:14

1 Answers1

0

First you can clean up your queries quite a bit.

var req = (from r in db.Requestors
                where r.RequestorID == requestor.RequestorID
                select r).SingleOrDefault();

var or = (from o in db.Orders.Include("OrderDetails")
                     where o.RequestorID == requestor.RequestorID
                     select o).SingleOrDefault();

Take a look at how .Include works to map all your related data. It's very useful.

You should only need to call SaveChanges() once too.

BZink
  • 7,687
  • 10
  • 37
  • 55