2011-11-04 72 views
0

我需要編輯數據庫中的記錄。我認爲我做得不夠好。我試過使代碼縮短dev = newDev;,但它沒有保存它。爲什麼model = newModel不起作用,但model.title = newModel.title的作品?

代碼

[HttpPost] 
[ValidateInput(false)] 
public ActionResult Edit(Dev newDev) 
{ 
    try 
    { 
     if (TryUpdateModel(newDev) == true) 
     { 
      var dev = _db.Devs.Where(x => x.ID == newDev.ID).Single(); 
      dev.Title = newDev.Title; 
      dev.Body = newDev.Body; 
      dev.Tags = newDev.Tags; 
      dev.Image1 = newDev.Image1; 
      dev.Image2 = newDev.Image2; 
      dev.Image3 = newDev.Image3; 
      dev.Image4 = newDev.Image4; 
      _db.SubmitChanges(); 
      return RedirectToAction(""); 
     } 
     else 
     { 
      return Content("Fail."); 
     } 
    } 
    catch 
    { 
     return View(); 
    } 
} 

你能在這裏幫我優化我的代碼?

+0

你想完成什麼? – drdwilcox

+0

請提供更多詳細信息,並給我們一個完整的工作代碼示例,包括保存到您的上下文中。例如,'newModel'來自哪裏?你在使用實體框架嗎? –

+0

model = newModel肯定有效。但是也許你正在用一種方法來執行這個操作,並期望這種改變也會出現在調用改變的方法中。在這種情況下,它將無法工作。如果你想能夠做到這一點,你必須通過引用傳遞變量(void methodName(ref Model model))。 –

回答

1

如果你正在使用實體框架(它看起來像?),那麼你不能以這種方式更新實體。

實體框架使用更改跟蹤來了解實體發生了什麼變化。爲此,它會保存從該上下文加載的特定實例的列表,以及它們的初始狀態,以便可以在調用上下文中的SaveChanges之前檢測對這些實例所做的更改。

當您直接指定給引用類型時,您只是重新設置引用。您不會更改初始對象實例。現有對該實例的引用(如實體框架在內部保持以跟蹤更改的實例)不會更改,並且最終會指向不同的對象實例。

所以,只需使用你現在擁有的代碼即可。這是盲目更新每個領域的唯一方法。如果沒有更新,實體框架的更改跟蹤應該會導致SaveChanges無法執行任何操作。如果更新了某些內容,它將執行相應的SQL以將更改保存到數據庫中。

2

您需要閱讀.NET使用的內存模型。設置dev = newDev將改變dev變量的值,但變量具有局部範圍。它不會更改引用同一對象的其他變量的值。

在這種情況下,你拉從dev上下文可能是跟蹤它拉出,並給你的dev的,因此,如果您更改其屬性和調用的SaveChanges那麼它會知道哪些值變化。

如果你只是想,而無需手動編寫一行代碼爲每個屬性的所有值從一個對象複製到另一個,你應該能夠use a tool like AutoMapper自動所有類似命名的屬性從一個地圖反對另一個。

+0

對於自動映射器建議+1。這將使您可以減少必須編寫的代碼數量,以將所有字段複製到數據庫跟蹤的對象實例。 –

1

如果還是不行,那麼:1。 開發是引用類型 2.開發一提的是被更改爲指向另一個對象(newDev)

這意味着,你是已經在背景之外使用了一個對象。爲了能夠更新該對象,您首先需要以某種方式將該對象附加到上下文,並使上下文知道它是其中某個現有實體的更新對象。

希望這會有所幫助。

相關問題