2011-03-16 134 views
1

我正在開發一個MVC應用程序,我不清楚保存這些實體的理想方式。我現在正在做的工作,但至少可以說是討厭的。實體框架Debacle

我的操作方法需要ViewModels並使用Automapper將它們映射到相關實體。我的實體是Requestor,Order和OrderDetail。

很明顯,SaveChanges方法的所有這些calles都是錯誤的,但我一直在遇到新增兒童問題,而不是在其他方面進行更新。

任何關於這段代碼應該如何看起來的幫助真的很感激。

傑森·麥肯齊

[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

這可能會有所幫助:http://stackoverflow.com/questions/3594515/how-to-update-an-entity-in-entity-framework-4-net/3594608#3594608對於處理關係也檢查此:http://stackoverflow.com/questions/3635071/update-relationships-when-saving-changes-of-ef4-poco-objects/3635326#3635326 – 2011-03-16 15:38:55

+0

'其中的一些事情' - 謹慎地闡述? – Yakimych 2011-03-16 17:14:28

回答

0

首先,你可以清理你的查詢不少。

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(); 

看看如何.include工程來映射您的所有相關數據。這非常有用。

您應該只需要調用SaveChanges()一次。

+0

請注意.FirstOrDefault()與.SingleOrDefault()的語義不同。() – dthorpe 2011-03-16 17:24:41

+0

對不起。使用FirstOrDefault()出於習慣。編輯我的答案,謝謝! – BZink 2011-03-16 17:54:51

+2

最乾淨的語法將沿着'db.Requestors.SingleOrDefault(r => r.RequestorID == requestor.RequestorID)'行出現。 – Yakimych 2011-03-16 18:12:16