2013-01-04 44 views
2

我正在使用MVC 3 Razor(c#),並在我看來我顯示的實體只有用戶可以更新Name屬性。在MVC中更新實體屬性

public class Product{ 
    public Guid Id {get; set; } 
    public string Name {get; set;} 
    public string Type {get; set;} 
    } 

爲了防止再次保存之前具有負載從數據庫中整個對象,我用的方法,如:

public void UpdateProduct(Guid id, Hashtable propertiesToUpdate) {} 
業務對象

,允許一組屬性的更新該實體由AJAX請求或表單Post組成。 (數據恆定性使用時間戳完成)。

我已經看過其他方法,例如在檢測到更改時使用INotifyPropertyChanged更新屬性,但這似乎只在您能夠在請求之間保留實例或在進行更改之前加載整個實體時纔有用(這似乎很重)。

我看到NHibernate使用動態更新類似的想法。這是否會導致NHibernate從數據庫加載數據並在生成更新語句之前進行比較?

是否有保持所述對象的最佳方式被編輯(會話[]?)請求或更新個人性質的較少笨拙方式之間(不移動到實體屬性值模型)?

+0

http://stackoverflow.com/questions/1243390/what-is-the-best-approach-to-update-only-changed-properties-in-nhibernate-when-s似乎解決了類似問題來自NHibernate方面的想法。 – Mark

+0

最後,我使用的內部列表UpdatedPropertiesList和更新呼叫爲數據存儲檢查該列表更新前。無需首先加載對象即可進行處理。 – Mark

回答

0

簡而言之:乾淨的方式做到這一點會得到你的實體身份參數並設置您想更新的屬性值,並將它們傳遞給業務層。

在服務層,可致電與實體標識符的信息庫和檢索單個實體和更新,你會喜歡做的特定屬性。

然而,常見的方法將使用DTO objects原則乾淨簡化您的CRUD操作。更多關於DTO and where it is useful.

+1

這與我現在所做的非常接近,謝謝分解!有時我發現自己陷入了最佳體系結構的困境。 – Mark

+0

沒問題,採取簡單,直接和可維護的解決方案是一條路。 –

0

除了處理路由和控制器實例的應用程序本身,MVC中沒有任何狀態。你不想試圖在應用程序中使用某種狀態,因爲沒有什麼好的方法可以保證它不會像AppDomain回收那樣被隨機銷燬。在加載頁面時,從數據庫中檢索記錄是否有問題,並且在使用POST數據更新時再次出現問題?我相信這是通常的做法。對於NHibernate來說,唯一需要花費很長時間的是創建SessionFactory,其他的都很快。

編輯:從您的評論擴大,NHibernate的是有讓您不必擔心接口的模型(數據庫)和你的控制器之間實現細節。這是一個爲您管理所有管道的框架。以模塊化方式構建您的應用程序,以便重要功能可以在以後輕鬆更換其他功能,而不會在應用程序中產生連鎖反應。使用存儲庫模式包裝NHiberante邏輯。然後,您可以在將來使用不同的ORM,而不會改變控制器與數據層的對話方式。您可能需要查看Inversion of Control/Dependency Injection來幫助解決這個問題。

+0

基本上,這是我的問題,當試圖包圍我的頭像洋蔥體系結構的想法。我假設在更新一個字段並將其發送回數據庫之前,從數據庫加載記錄會帶來很多開銷。這個過程的開銷是否值得擔心? – Mark

+0

基本上我想要的是不用擔心實現細節,擔心應用程序設計。讓框架處理管道。 – mortalapeman

+0

已經考慮過ORM,但由於各種原因避免了它們。感謝您的建議。 – Mark