2012-01-08 57 views
0

我使用亞音速在mvc應用程序中訪問我的數據庫。 當使用mvc模型綁定嘗試更新記錄時,記錄不會更新,因爲非列的標記爲髒。如何使用monic模型綁定使用Subsonic更新?

我試圖通過調整亞音速代碼手動標記所有列爲髒,但有時我只想更新一些屬性,所以我不想將它們全部標記爲髒。

要做到這一點的最佳方法是什麼?

這是我的行動:

 [HttpPost] 
     public ActionResult Update(mapping m) 
     { 
      m.SetIsNew(false); 
      m.Update(true); // here i tweaked the subsonic code passing true sets all the columns to be dirty and updates the record even though isLoaded=false 
      return RedirectToAction("New"); 
     } 

這是我調整了亞音速代碼:

public void Update(IDataProvider provider, Boolean forceUpdate){ 
      if(this._dirtyColumns.Count>0 || forceUpdate){ 
       if(forceUpdate) 
        this._dirtyColumns = this.Columns.ToList(); 
       _repo.Update(this,provider); 
       _dirtyColumns.Clear();  
      } 
      OnSaved(); 
     } 

編輯:

我嘗試了這個代碼,看看問題出在哪裏謊言:

var m = new mapping { ID = 2, Name = "33" }; 
m.SetIsNew(false); 
m.Save(); 

這也不起作用的列沒有設置爲髒。看起來,當使用對象初始值設定項時,設置程序不會被調用,所以列不會變髒。

我會假設默認的mvc.net模型綁定以這種方式工作,這就是爲什麼記錄沒有被更新。

編輯2

我的第一個編輯是錯誤的,因爲@ dyork12指出。 Subsonic使用'isLoaded'標誌,當它被設置爲false時,設置屬性不會將它們設置爲髒。亞音速在加載記錄時使用,以確保加載時的設置屬性不會被設置爲髒。

但我的問題仍然是什麼是使用自動模型綁定從mvc.net視圖編輯亞音速對象的最佳解決方法。

+0

在您的視圖上,您​​是綁定SubSonic生成的對象還是使用ViewModel?你見過這個嗎? http://stackoverflow.com/questions/5491733/subsonic-and-automapper-dirtycolumns-collection-is-empty-therefore-cant-updat – DaveHogan 2012-01-10 08:13:50

+0

爲什麼他們不標記髒?該代碼片段來自ActiveRecord,如果綁定到列屬性,它應該都可以正常工作。你有什麼不同?請更多代碼。 – 2012-01-10 12:57:06

+0

@ dyork12:我在'編輯'中回答。 – Daniel 2012-01-10 14:22:19

回答

0

所以原來的問題(像現在的理解)是MVC莫名其妙地加載行,並創建DAL對象爲他們竟未isLoaded標誌,然後任何對設置者的調用都不會被添加到dirtyColumns列表中。在調用任何setter之前,您必須找到一種在加載記錄和創建DAL對象之後設置isLoaded的方法。

對不起,我不知道MVC是否足夠幫助,並且您沒有包含該部分的任何代碼。我希望插入某種事件,或從某物繼承,或者修改模板等等。只要您找到設置isLoaded的方法,您就可以解決問題。我希望。

+0

謝謝,我想這是要走的路。但在我看來,isLoaded標誌的工作方式是不直觀的,它不應該在那裏。如果亞音速加載數據庫中的記錄時出現問題,它應該設置加載標誌,然後在完成時取消設置,亞音速用戶不應該看到這一點。 – Daniel 2012-01-30 06:42:12

+0

這是一個常見的模式,有一個加載標誌和髒標誌。加載的標誌表示從數據庫中檢索到一行;髒旗說它已被修改;它們一起涵蓋所有組合。如果您打算在不使用提供的API的情況下加載/保存行,那麼您有責任根據需要了解和維護這些標誌。必須正確設置保存/更新才能正常工作。 – 2012-02-03 23:34:43

1

我會踢一腳,說我認爲答案是_isLoaded是錯誤的。沒有看到更多的代碼,我無法告訴你爲什麼。

如果您創建新記錄,則_isNew爲true,_isLoaded爲false。當你保存它時會執行INSERT並忽略髒列。

如果您加載現有記錄_IsNew爲false且_isLoaded爲true。當你保存它時會進行更新並只更新髒列。

您的代碼片段將_isNew設置爲false,但不會將_isLoaded設置爲true。列沒有標記髒,所以沒有保存。通過閱讀ActiveRecord生成的代碼很容易看出。

[BTW你錯了關於制定者 - 他們是由一個對象初始化器調用。]

+0

謝謝。我編輯了我的問題來解決我的錯誤。我發佈的代碼是所有代碼'映射'是它通過mvc.net的自動模型綁定加載並隨後更新的亞音速對象。設置isLoaded爲true並沒有幫助,因爲屬性並不髒。有什麼辦法可以使用自動綁定? – Daniel 2012-01-15 11:05:08