2011-05-25 68 views
0

我有一個解決方案,其數據後端使用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代理,因此我將它作爲我的標籤條的一部分,因爲它可能是解決方案/問題的一部分。

回答

1

更好地設計你的表單。你沒有「刪除」每個項目的鏈接或複選框?

(恕我直言,這是一個不存在的問題)

+0

從表單刪除它們是不是問題 - 問題是,當回發到控制器,與數據庫存儲的模型同步的。 – Ciel 2011-05-25 13:16:10

+0

我不明白爲什麼。 「Delta」的適當視圖模型將指示用戶選擇刪除哪些項目(如果您使用複選框)。如果您使用的是刪除鏈接,則可以通過ajax刪除Delta項目。 – jgauffin 2011-05-25 13:23:14

+0

這不是問題的關鍵。數據存儲在ViewModels中,而不是原始模型。嵌套數據也是一個ViewModel。同步嵌套數據將刪除原始數據並根據ViewModel重新創建新對象,從而導致關聯問題。我不能說'Session.SaveOrUpdate(viewModel);'。如果我使用賦值操作符將「Delta」對象分配給所有者,那麼它會在數據庫將其推入時刪除先前的關聯。 – Ciel 2011-05-25 18:07:00