2012-04-12 14 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

答えて

2

あなたのコードに何か他のことがあるかもしれませんが、NHibernate Profilerを試用版として使用することをお勧めします。その試用版はwww.nhprof.comからダウンロードでき、解雇されているSQLコマンドや、が検索されています。

また、なぜトランザクションを最初にコミットしているのかわかりません。

この特定の問題を解決するには、NHibernate StatelessSessionのどのトラックエンティティを使用するか、Session.Evictを使用してNhibernateに特定のオブジェクトのトラッキングを停止するよう依頼することができます。

+0

これは単なるサンプルコードで、実際のコードは基本的にhttp要求レベルでUnitOfWorkパターンを使用しています。トランザクションはリクエストの開始時に開始され、httpリクエストの終了時にコミットされました。コードをインラインにすると、理解しやすくなります。基本的には同じことをしています。 – Eatdoku

+0

私は持っている問題を回避するために、検索されたオブジェクトにSessino.Evictを使用していますが、正確に何が起こっているのか理解したいと思います。 – Eatdoku

+0

私はあなたのユニットのどこかで、取り出されたエンティティを変更していると推測しています。それは保存しようとしているものです。あなたのフロー全体を調べて、 – Baz1nga

関連する問題