2017-10-09 64 views
1

我們的模式包含一個包含複合主鍵的表。該實體沒有任何版本/時間戳列。映射是:無法確定實體是否爲瞬態或在刪除時分離

mapping.CompositeId().KeyReference(e => e.ParentEntity).KeyProperty(e => e.DTFR); 

當用戶點擊刪除按鈕,HTTP請求被髮送到服務器,服務器創建新的NHibernate會話,並調用session.Delete()

 using (var session = SessionFactory.OpenSession()) 
     using (var trans = session.BeginTransaction()) 
     { 
      foreach (var entity in entities) 
       session.Delete(entity); 
      return trans.TryCommit(); 
     } 

但NHibernate的給出了一個警告:

無法確定是否{實體}與分配的標識符{實體}是 瞬態或分離;查詢數據庫。在會話中使用顯式的Save()或 Update()來防止這種情況發生。

並裝載從數據庫中刪除它之前的實體。

我們不能從警告遵循建議,並使用Save()Update()刪除實體。

我們應該如何改寫我們的代碼以避免刪除數據庫的查詢過大?

+0

如何填充了'entities'收藏? –

+0

'entities'加載HQL(在其他NHibernate會話中),然後序列化爲JSON,然後傳遞給客戶端,反序列化,最後返回到服務器。 – user2291296

回答

1

我想這是因爲您使用刪除的實體不知道的NH會話/不跟蹤他們。

對於刪除,需要使用HQL查詢的Delete()method過載。這可能是一種可行的,可以說是更有效的方法來做你想做的事情?

喜歡的東西:

using (var session = SessionFactory.OpenSession()) 
using (var trans = session.BeginTransaction()) 
{ 
    session.Delete($"FROM EntityTable WHERE Id IN ({entities.Select(e => e.Id})"); 

    return trans.TryCommit(); 
} 
+0

據我的理解,你的建議是不要向實體提供NHibernate,所以它不會懷疑它們是暫時的還是分離的。但我不確定是否可以通過組合鍵生成HQL來刪除多個實體。也許有一種明確的方式來說NHibernate將實體視爲暫時的或分離的? – user2291296

+1

您是否在映射中使用過'unsaved-value'屬性?這可能有幫助。 –

+0

它看起來像'UnsavedValue( 「任何」)'解決了這個問題: 'mapping.CompositeId()KeyReference(E => e.ParentEntity).KeyProperty(E => e.DTFR).UnsavedValue( 「任何」) ;' – user2291296

相關問題