2012-03-01 3 views
1

最近、プロジェクトでNHibernateを使用しようとしています。以下のコードを参照してくださいNHibernateでエンティティステータスを管理できますか?

var _sessionFactory = cfg.BuildSessionFactory(); 
     var _session = _sessionFactory.OpenSession(); 
     var user = new User() {UserName = "carl", Gender = 1}; 
     _session.Save(user); 
     _session.Delete(user); 
     _session.Flush(); 
     _session.Close(); 
     _sessionFactory.Dispose(); 

NHibernateはユーザーをdbに保存してからdbから削除します。私はコードが奇妙であることを知っていますが、NHibernateが実際にdbに2回アクセスする必要はないことを知りたがっています。エンティティフレームワークは異なる動作をしますが、メモリ内のユーザーオブジェクトの状態を切り替えます。フラッシュすると、データベースにアクセスして永続化します。もちろん、削除済みとしてマークされているユーザーは永続化されません。 dbアクセスは必要ありません。それは私が欲しいものです!

NHibernateがEFのようなEntity Statusを変更するインタフェースを持っていることを知っている人はいますか?

+1

Userクラスのマッピングは何ですか? (想定されている)id-keyに対してデータベースのラウンドトリップが必要ですか?オブジェクトを削除することがわかっている場合、オブジェクトを永続化する理由は何ですか?なぜあなたはそれを避ける必要があるので、単一のデータベース呼び出し(削除)は非常に高価だと思いますか?ロールバックしたトランザクションを使用しようとしましたか? – sisve

答えて

0

エンティティがデータベースにすべて保存される理由は、NHがimmediatly挿入するように強制するIdentity IDの生成を使用しているためです。あなたがHiLoのような別の戦略を使用する場合は、あなたが期待したものを見るでしょう。

+0

あなたは正体のIDについて正しいです!私はHiLo戦略に設定した後、NHibernateはまだそれをdbに保存し、dbから削除します。その理由は、NHiberateがすべてのアクションをActionQueueに保存するからです。あなたがセッションをフラッシュするとき。それはすべてのアクションを引き出し、それを呼び出すでしょう。私はそれをするのが最善の方法ではないと思います! NHibernateはエンティティの状態を追跡し、それを保存するかどうかを決定する必要があります。 – user418751

+0

私はこれの背後にある理由は、トリガ、nhibernate.enversまたは何が起こったのか知りたいことがあるかもしれないということだと思います。これをトランザクション内にラップしてロールバックすると、何も送信されません。 – Firo

0

まずIDのIDがデータベースの挿入をトリガーします。あなたはそれを手助けできません。 hi-loに変更しても、挿入が行われないことは保証されません。理由は、HibernateのNHibernateのISession世代と、NHibernateSessionFactoryと、デフォルトのFlushModeにあります。

FlushModeメカニズムについては、NHibernate Referenceの9.7節を参照してください。あなたの場合は、FlushModeをNever(FlushMode.Never)に設定して、舞台裏のフラッシュが発生しないようにする必要があります。

+0

私はFlushMode.Neverを試しましたが、それでも2回のdbアクセスで保存/削除されました。私はそれがNHibernateがこの関数をどのように構築するのかを正確に考えています。私のコードでdbアクセスを取り除く方法がないかもしれません。 NHibernateは、エンティティの最終ステータスではなく、コードのすべてのアクションをトレースすることによってORMを管理します。別の言葉で。私は上記のように愚かなコードを書く場合。 NHibernateは私のようにそれを愚かに続けるでしょう。 – user418751

関連する問題