2017-05-22 42 views
1

如何使用NHibernate更新實體並忽略它們的值爲空(在更新的實體中)時的某些屬性?
如果屬性值不爲空,它應該包含在更新中。Nhibernate流利在條件更新時忽略屬性

實施例,與具有IdName的實體:

  • 如果名字是空我們更新而不名的實體。
  • 如果名稱不爲空,我們用名稱更新實體。
+0

你有沒有嘗試過自己呢?此平臺旨在幫助您創建,而不是爲您創建。 –

+0

如果名稱列可以爲空,則您將獲得此功能。或者我錯過了你的問題的重點? –

+0

當然,我嘗試過的東西之前,但我找不到任何網站 –

回答

1

你需要做兩兩件事:

  • 啓用dynamic updates。默認情況下,NHibernate爲每個實體準備一個更新查詢來更新除主鍵以外的所有列。當更新實體時,它通過指定所有值來使用它,包括那些沒有改變的值。所以你需要告訴NHibernate使用動態更新,它會在每次更新時生成一個即席更新查詢,以僅更新已更改的屬性。
    使用hbm,您必須在您的類映射上放置dynamic-update="true"。可能有一些適當的類映射方法需要流利地進行調用。使用interceptorevent來定製骯髒檢查算法。關於堆棧溢出的一些答案,如this oneother one (from me)
    他們不是關於你的要求,但適應他們不應該很難。
+0

如果我理解你的話,我需要調用db來攔截,所以它的意思是我在更新之前從db中檢索數據。有沒有什麼辦法可以做到這一點,而不需要從數據庫中檢索實體? –

+0

@ItayGolan,你不需要明確地做,NHibernate會在分離的實體上調用'ISession.Update()'的時候爲你做。 (如果你已經在會話中加載了實體,然後嘗試用分離的版本更新它,請使用'Merge')。如果你不想讓NHibernate加載實體來更新它,你可以使用[tag:hql ]按照解釋[這裏]更新查詢(http://nhibernate.info/doc/nhibernate-reference/batch.html#batch-direct)。但這不是使用ORM的通常模式。 –