問題タブ [isession]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nhibernate - NHibernateISessionを取得して主キーによって取得されないエンティティをキャッシュする方法
私の「user」エンティティは、ほとんどの場合、整数の代理キーではなく、usernameによって取得されます。ユーザー名は主キーではないため、これはISessionがユーザー名をキャッシュせず、同じデータを取得するためにデータベースに繰り返しアクセスすることを意味します。
ユーザー名で取得したユーザーをキャッシュするようにISessionを取得するようにNHibernateを構成する方法はありますか?
nhibernate - nhibernate lazyload は新しいセッションを作成します
遅延読み込み時に nhibernate が新しい ISession を作成するのを防ぐことはできますか? どのように?
訂正: 新しい IDbConnections のことです。独自の DriverConnectionProvider を実装しましたが、遅延読み込みのために呼び出されることがわかりました
nhibernate - 1つのisessionと同じidbconnectionをnhibernateします
同じISessionでsession.Get(id)を2回実行するコードがあります。ISessionが2つのidbconnectionsを作成していることがわかります。これはある種の構成によるものだと思います。同じidbconnectionでフェッチを実行したいと思います。どのように?
repository - ビジネス層内で Unit of Work/Repositories を使用する正しい方法は何ですか?
Unit of Work/Repository パターンを使用して小さなアプリケーションを構築したので、ビジネス レイヤー内でこれを適切に使用する方法を理解するのに苦労しています。私のアプリケーションには、NHibernate または Entity Framework のデータ アクセス レイヤーがあります。これらを簡単に切り替えることができます。
Customer、Order など、多数のリポジトリがあります。私の作業単位は、テストする DAL に応じて、ISession またはオブジェクト コンテキストのいずれかになります。
私のビジネス層には、CreateOrder() という 1 つのビジネス メソッドが含まれています。私が理解するのに苦労しているのは、ビジネス層のどこで作業単位とリポジトリを初期化する必要があるかということです。
Nhibernate に注目すると、私の DAL は次のようになります。
ビジネス層内で、作業単位とリポジトリを宣言する場所を知りたいです。それらはクラス レベルまたは CreateOrder メソッド内で宣言されていますか?
例えば:
上記のコードは、CreateOrder() メソッドが初めて呼び出されたときにのみ機能しますが、セッションが閉じられているため、それ以降の呼び出しでは機能しません。トランザクションのコミット後に「context.Close()」呼び出しを削除しようとしましたが、これも失敗します。上記のアプローチは機能しませんが、このスコープでリポジトリと作業単位を宣言する方が正しいように思えます。
ただし、代わりに以下のように実装すると問題なく動作しますが、メソッド自体のスコープ内でリポジトリと作業単位を宣言するのは不自然に思えます。ビジネスメソッドが大量にある場合、リポジトリと作業単位をいたるところに宣言することになります。
これをクラス レベルの宣言で実装する場合、CreateOrder メソッドの開始時に同じ作業単位を再度開く手段が必要になると思います。
ビジネスレイヤー内で作業ユニットとリポジトリを使用する正しい方法は何ですか?
nhibernate - factory.OpenSession()でNHibernate 2.1.2接続が開きますか?
でセッションを開くと
var session = factory.OpenSession();
session.Connection.State が Open であることを確認します。「接続」のタイプは SqlConnection です。これは、セッションを作成することにより、接続が自動的に開かれることを意味しますが、NH ではそうではないと思いました。NH がフラッシュの最適な時間を決定するまで、これを閉じるべきではありませんか? 私は何を間違っていますか?
hibernate.cfg.xml:
nhibernate - NHibernate ISession.Save() - エンティティがすぐに永続化されるのはなぜですか?
NHibernate を使用して多数のエンティティを作成し、それらを ISession にアタッチしてから、トランザクションを使用して変更をデータベースにコミットしています。コードサンプルは次のとおりです。
行 _context.Save() は単に ISession に新しいエンティティを認識させるだけであるという印象を受けましたが、行 tx.Commit() を介してセッションをフラッシュするまで、変更はデータベースに永続化されません。
私が観察したことは、_context.Save() を呼び出すたびに、データベースが新しいエンティティを取得することです。その結果、データベースへの個々の呼び出しが多すぎます。
ISession.Save() が自動的に変更を永続化する理由を知っている人はいますか? NHibernate の動作について何か誤解していませんか? ありがとう。
***編集-明確にするために(2つの提案された回答に照らして)-ここでの私の問題は、_context.Save()を呼び出すとすぐにデータベースが更新されることです。私はこれが起こるとは思わない。tx.Commit() を呼び出すまで、データベースに何も挿入されないことを期待しています。残念ながら、これまでに提案された2つの回答はどちらもこれに役立ちません。
ID ジェネレーターに関するいくつかの優れた情報については、こちらを参照してください。
sql-server - 流暢な休止状態でSQLServerとのセッションを作成する方法
SQLServerとの接続の作成中に例外が発生します。
ISession
例外が発生しているファクトリを以下に示します。
次の例外がスローされます。
'd:\ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Cfg\Configuration.cs'のソースを検索しています。(チェックサムなし。)
ファイル'd:\ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Cfg\Configuration.cs'は存在しません。
'd:\ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Cfg \ Configuration.cs'のスクリプトドキュメントを検索しています...
'd:\ CSharp \ NH \ NH \ nhibernate \ src\NHibernateのプロジェクトを検索しています\ Cfg \Configuration.cs'。
プロジェクトでファイルが見つかりませんでした。
ディレクトリ'C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ crt \ src \'...
を検索していますディレクトリ'C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ src \mfc\'を検索しています。 ..
ディレクトリ'C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ src \ atl\'..を探しています。
ディレクトリ'C:\ Program Files \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ include \'...
を調べています。アクティブなソリューションのデバッグソースファイル設定は、デバッガーがユーザーにファイルの検索を要求しないことを示しています
。d: \ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Cfg\Configuration.cs。
デバッガーはソースファイル'd:\ CSharp \ NH \ NH \ nhibernate \ src \ NHibernate \ Cfg\Configuration.cs'を見つけることができませんでした。
c# - 困惑: カスタム NHibernate セッション管理で「指定されたキャストが無効です」という例外が発生する (C#)
コンソール アプリケーションに適切な NHibernate セッション管理を実装しようとしていますが、非常に奇妙な問題が発生しています。ある瞬間、すべてが正常に機能しているように見えますが、ランダムに、datetime 値を指しているように見える特定のオブジェクトを取得しようとすると、突然「指定されたキャストは無効です」という例外がスローされ始めますが、それ以上の情報はありません提供された。
これで、文字列フィールドと主キー (GUID) 以外のすべてのフィールドをコメントアウトしただけなので、マッピングに問題が発生する可能性がなくなりました。それにもかかわらず、例外はスローされ続けます。また、問題のオブジェクトには子オブジェクトが含まれていません。
代わりに、セッションの呼び出し方法に問題があると思われるため、セッションのキャッシュに、漠然とした理由でこの問題を引き起こす何かがあります。
セッションを管理するために、この Util クラスを使用します。
したがって、DataObjectManager クラスのすべての操作の開始時に、次のようにセッションを取得するスーパークラスから継承された共通メソッドからセッションを取得します。
コンソール アプリ (または単体テスト) の 1 回のスイープですべての操作が完了したら、DisposeCurrentSession メソッドが呼び出されることを確認します。
これらの例外が発生するのを防ぐために改善できることはありますか?
編集
これはスタック トレースです。
そして、それが発生する方法:
EDIT2:
これは、オブジェクトを取得するときにセッションが自動的にフラッシュされるときに発生するということです。そのため、以前のトランザクションからセッションに存在していたが、まだフラッシュされていないオブジェクトでエラーが発生しているようです。そのため、問題は再び使用されるまでセッションに潜んでいます。
nhibernate - NhibernateISessionの上に独自の作業単位を使用する必要があります
キャッスルウィンザーを学び始めたところです。NhibernateISessionの上に別の作業単位を追加する必要があるかどうかについて質問してください。
ウィンザーのチュートリアルでこれを見つけました。
http://docs.castleproject.org/Windsor.Windsor-Tutorial-Part-Six-Persistence-Layer.ashx
「重要なのは、今行ったことの目に見えない効果です。コンポーネントを登録することで、Windsorにコンポーネントの作成方法を指示しただけではありません。Windsorは、インスタンスを適切に破棄して、完全な管理を行います。素人の言葉で言えば、Windsorは、使用されなくなったときに両方のオブジェクトを破棄します。つまり、ISessionに加えた変更をデータベースにフラッシュし、ISessionFactoryをクリーンアップします。これですべてが取得されます。無料で。 "
データベースに変更をコミットする必要はないようです。Windsorがそれを処理します。Windsorは、ページが閉じられた後、または完全にロードされた後にそれを行うと想定しています。
今、私は他の人々がこのようなNhibrenateの上に別の作業単位を追加しているのを見ます。
どちらがベストプラクティスと見なされているのか知りたいですか?