我有一個解決方案,其數據後端使用Fluent nHibernate
,並且我在前端使用ASP.NET MVC 3.0
。我以爲我很聰明,用Model View ViewModel
的方法來解決一些事情,但它有點讓我反感......使用ASP.NET MVC 3.0中的數據模型同步視圖模型
這是我的模型。
class Alpha {
virtual Guid Id { get; set; }
virtual string Name { get; set; }
virtual IList<Delta> ListOfItems { get; set; }
}
class Delta {
virtual Guid Id { get; set; }
virtual string Name { get; set; }
// some other properties
}
工程很好。現在,這裏是我的AlphaViewModel
class AlphaViewModel {
string Name { get; set; }
IList<Delta> ListOfItems { get; set; }
}
我使用視圖模型,以避免與代理衝突。因爲我知道第一個問題將是「您的視圖模型看起來就像您的模型,使用它沒有意義」。這工作正常,但現在這裏出現我的問題。
想象一下下面的過程..
- 用戶創建阿爾法通過使用AlphaViewModel
- 數據庫保存阿爾法
- 用戶通過添加的新實例三角洲ListOfItems property
- 數據庫保存Alpha,以及新的Delta Delta項目。
- 用戶編輯阿爾法
- 用戶刪除三角洲
- 數據庫的1個實例去拯救...
現在我們有一個新的問題。數據庫並不知道它正在改變的Id
。
我可以將Id
添加到ViewModel,但這並不能解決所有問題。我已經看到人們如何處理這種情況與新增新項目,但我找不到任何好的解決方案,顯示他們刪除他們以及。誰能提供一些見解?
我知道這個問題與nHibernate無關,但由於我的部分推理涉及到nHibernate代理,因此我將它作爲我的標籤條的一部分,因爲它可能是解決方案/問題的一部分。
從表單刪除它們是不是問題 - 問題是,當回發到控制器,與數據庫存儲的模型同步的。 – Ciel 2011-05-25 13:16:10
我不明白爲什麼。 「Delta」的適當視圖模型將指示用戶選擇刪除哪些項目(如果您使用複選框)。如果您使用的是刪除鏈接,則可以通過ajax刪除Delta項目。 – jgauffin 2011-05-25 13:23:14
這不是問題的關鍵。數據存儲在ViewModels中,而不是原始模型。嵌套數據也是一個ViewModel。同步嵌套數據將刪除原始數據並根據ViewModel重新創建新對象,從而導致關聯問題。我不能說'Session.SaveOrUpdate(viewModel);'。如果我使用賦值操作符將「Delta」對象分配給所有者,那麼它會在數據庫將其推入時刪除先前的關聯。 – Ciel 2011-05-25 18:07:00