2013-10-23 40 views
2

我正在寫一個web應用程序,使用asp.net MVC剃刀意見,其中數據和從服務器通過使用AJAX處理,並映射到UI KnockoutJs。如何重新連接從Asp.Net MVC 4對象功能NHibernate

我的模型是分層的,並有子對象列表。現在,這裏的漁獲:

當我編輯的主要對象(即已經在數據庫中) - 改變了一些特性,增加了一個孩子,等等 - 我應該如何去NHibernate的更新呢?

在一個Windows應用程序在NHibernate會話存在的主要對象和可以很容易地更新。在我的webapp中,我將JSON去序列化爲一個「新」對象,然後需要重新連接到NHibernate會話。實際上這個反序列化是由模型綁定者完成的。

有沒有這樣做的巧妙方法?我嘗試了合併,但它不適用於添加的孩子。

我目前的解決方案是seperately處理每一個變化的模型,即。當我添加一個孩子時,我通過NHibernate進行更新(通過id加載mainmodel,將該孩子添加到模型並命中更新),當我更新一些簡單的屬性時,我使用merge。我只是不認爲這個解決方案非常優雅。

有什麼建議嗎?

+0

您是否嘗試過一個簡單的'nhibernateSession.SaveOrUpdate(myNewObject);'或'nhibernateSession.Update(myNewObject);'? – jbl

+0

是的。 Hibernate識別對象的id,並拒絕它。 – jand187

+0

澄清:我試圖保存的對象在Hibernate會話中沒有引用,因爲它是由MVC Modelbinder創建的。該對象是等於我的會話,但不是ReferenceEquals。 – jand187

回答

1

當你從一個有狀態的世界轉移到一個無狀態的世界時,這絕對會令人困惑。你有模式雖然剛剛好,在你的操作方法:

  1. 負載從數據庫對象
  2. 使基於視圖模型
  3. 改變它刷新了會議/提交事務

如果在會話中跟蹤對象,則不需要調用Update或SaveOrUpdate,而您;重新使用合併不正確。通常,您需要調用的唯一持久性方法是保存,以使新對象持久化。

+0

因此:從數據庫加載,並將MVC創建的模型的所有更改映射到加載的模型數據庫? – jand187

+0

我可以在沒有更新的情況下將新的子對象添加到現有模型嗎? – jand187

+0

是的,從數據庫中加載,更新模型,提交事務可以添加新的子對象而不用更新,因爲默認的級聯模式Many-很多關係都不一樣,新的對象必須先保存下來 –