2012-04-12 68 views
0

我試圖通過存儲過程中的nhibernate的CreateSQLQuery從數據庫檢索數據。像下面的代碼。NHibernate CreateSQLQuery對待實體更新

然後我基本上在做一個會話事務提交,但是提交會拋出一個「無法更新」異常。它試圖在CustomEntityDao上執行更新語句。

 const string selectSQL = "EXEC GetDataSP @Id = :Id"; 
     var query = Session.CreateSQLQuery(selectSQL); 
     query.SetString("Id", "10"); 
     query.AddEntity(typeof (CustomEntityDao)); 

     var entityList = query.List<CustomEntityDao>(); 

     try 
     { 
      Session.Transaction.Commit(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

我的問題是,爲什麼這些實體被視爲修改,你可以在代碼中看到我只是做一個查詢。

+0

您應該發佈有問題的映射和實體 - 通常這是映射不匹配的標誌。 – AlexCuse 2012-04-12 20:59:33

回答

2

可能還有別的東西在你的代碼中,我可以建議的是使用NHibernate Profiler的一個試用版,它可以從www.nhprof.com下載並監控正在被解僱的SQL命令並注意到哪些對象正在被檢索。

另外我不明白你爲什麼在第一個地方進行交易。

爲了解決你總是可以使用NHibernates StatelessSession其犯規跟蹤實體這個特殊的問題,或者您也可以使用Session.Evict並要求NHibernate的停止跟蹤特定對象。

+0

這只是一個示例代碼,其中真正的代碼基本上是在http請求級別使用UnitOfWork模式。事務在請求開始時開始並在http請求結束時提交。我把代碼內聯,因爲它更容易理解。基本上它是做同樣的事情。 – Eatdoku 2012-04-13 17:55:28

+0

我在檢索的對象上使用Sessino.Evict來解決我遇到的問題,但我想知道究竟發生了什麼。 – Eatdoku 2012-04-13 17:57:06

+0

我在你的單元中的某個地方猜測你正在修改檢索到的實體,這就是試圖保存的東西..通過你的整個流程,看看有什麼修改 – Baz1nga 2012-04-14 07:45:31