2010-03-14 74 views
1

我的形式包括客戶端實體屬性的子集,我還包括保存在客戶端的ID的隱藏字段。客戶端實體本身通過GET Edit操作提供。實體更新後編輯行動

現在我想做的實體更新,但到目前爲止,我只試圖不先加載從DB的實體。因爲進入POST編輯的客戶端對象具有它需要的一切。我只想更新數據存儲中實體的那些屬性。

我移植從3.5我的應用程序4.0 RC1和我的代碼看起來像現在這樣:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(Client client) 
    { 
     try 
     { 
      using (DocInvoiceEntities edmx = new DocInvoiceEntities()) 
      { 
       if (string.IsNullOrEmpty(client.client_firstname)) 
        ViewData.ModelState.AddModelError("client_firstname", "Firstname!"); 

       if (string.IsNullOrEmpty(client.client_lastname)) 
        ViewData.ModelState.AddModelError("client_lastname", "Lastname!"); 

       // postcode 
       client.PostCode = (from p in edmx.PostCodes where p.postcode.Equals(client.PostCode.postcode) select p).First(); 

       // check for errors 
       if (!ViewData.ModelState.IsValid) 
        throw new InvalidOperationException(); 

       // save changes to datastore 
       edmx.Clients.Attach(edmx.Clients.Single(c => c.client_id == client.client_id)); 
       edmx.Clients.ApplyCurrentValues(client); 
       edmx.SaveChanges(); 

      } 
      return RedirectToAction("Create", "Invoice"); 
     } 
     catch 
     { 
      return View(); 
     } 

ApplyCurrentValues()調用拋出此異常: 「在ObjectContext中現有的對象是在加只有當現有對象處於未更改或修改狀態時,才能應用更改。「

+1

你不覺得你會發布你使用的代碼和那些「各種例外情況」嗎? – jfar 2010-03-14 23:06:26

+0

同意@jfar。另外:爲什麼直接綁定到實體,而不是使用編輯模型?爲什麼要「優化」一個更新,而這個更新很少是開始時的性能瓶頸? – 2010-03-15 12:57:36

+0

「編輯模式」是什麼意思? – mare 2010-03-15 14:25:19

回答

1

如果您從您發送對您的EntityKey ID和只是想然後保存您發佈的價值觀,所有你需要的是:

edmx.Clients.Attach(client); 
edmx.SaveChanges(); 
+0

謝謝你的工作,但爲什麼Cephas建議ApplyCurrentValues()? – mare 2010-03-15 19:54:20

+0

idk,但這就是爲什麼我投票給他 – jfar 2010-03-15 21:36:07

0

我不知道的一個很好的方式來做到這一點。 它似乎應該是附加編輯的對象和保存更改的情況下,但框架不會這樣工作。

總之魔術的SaveChanges只能從您正在使用的情況下創建的實體對象。控制器創建的實體對象不具備資格。

嘗試這樣的事情(MVC 2和EF 4)

[HttpPost] 
public ActionResult Edit(Client clientToEdit) 
{ 
    db.Client.Attach(db.Client.Single(c => c.ID == clientToEdit.ID)); 
    db.Client.ApplyCurrentValues(clientToEdit); 
    db.SaveChanges(); 
} 

它確實需要以更新的查詢,但我還沒有碰到過它周圍的可靠的方法來。 d

+0

我不得不升級到4.0,從3.5到使這個可用,但我現在,但在ApplyCurrentValues有一個例外: 「在ObjectContext中的現有對象是在加狀態的改變只能應用在現有對象處於未改變或修改的狀態。「 – mare 2010-03-15 16:28:41

+0

看起來像你的Client.PostCode是一個不是標量屬性的關係 更改一個關係會將對象置於'Added'狀態 如果您調用ApplyCurrentValues來更新標量屬性,那麼更改它可能工作的PostCode – Cephas 2010-03-15 23:19:22

0

您可以使用TryUpdateModel()這樣的...

​​