2

同じ構造 (同じタイプのレコードのリスト) のデータを返す 2 つのストアド プロシージャを使用します。

メソッド Execute(ISession session) を 2 回呼び出します。最初のストアド プロシージャは初めてです (6 行の正しいリストが返されます)。2 回目 - 2 番目のストアド プロシージャの場合 (11 行のリストが返されますが、最初の 6 行は正しい行を上書きする最初の要求からのものです)。

数式 (ランクなど) としてマップされた計算値を含む結果を検索するための NHibernate キャッシュへの影響を見つけまし た

しかし、IQueryには使用できません

修正方法のアイデアやリンクはありますか?

public dynamic Execute(ISession session)
{
    var query = session.GetNamedQuery(QueryName)
        .SetCacheable(false)
        .SetCacheMode(CacheMode.Ignore)
        .SetReadOnly(true);
    var results = query.List<T>();
    return results;
}
4

2 に答える 2

3

私は何が起こっているのかの予感を持っていると思うので、これに答えることに挑戦するつもりであり、あなたを正しい軌道に乗せたい. 私はここで多くの仮定を行ったので、私の推測が完全に間違っていたとしても、あまり厳しくしないでください.

行をオブジェクトに単純に変換するためのツールとして NHibernate を使用しようとしているように感じます。NHibernate は、オブジェクト指向のドメイン モデルとリレーショナル データベースのドメイン モデルを変換するツールです。行をオブジェクトに変換するだけでなく、さらに多くのことを行います。特に、ここでつまずいている NHibernate の機能は、NHibernate が単一の NHibernate セッション内で、単一のエンティティを表すデータベース内の単一の行がオブジェクトの単一のインスタンスに対応することを保証する方法です。これを実現するために、第 1 レベルのキャッシュが使用されます。

QueryA と QueryB の 2 つのクエリがあるとします。これらのクエリは、それぞれ別のテーブル (TableA と TableB) からプルするように構築されているため、実際には別々のエンティティを表しています。ただし、結果が同じエンティティのように NHibernate に見えるように、クエリも何らかの形で構築されています。QueryA と QueryB がたまたま同じ ID を返す場合、NHibernate はそれらを同じインスタンスに結合するため、QueryB を実行すると、QueryA からの結果の一部が繰り返されます。

では、どうすれば修正できるでしょうか。

手っ取り早い修正方法は、これら 2 つのクエリのそれぞれに異なるセッションを使用するか、session.Clear()その間にセッションをスローすることです。より適切な修正は、これらの名前付きクエリを変更して、実際に 2 つの異なるエンティティを返すようにすることです。

于 2013-08-28T04:21:48.317 に答える
1

私は同じ問題を抱えています。最初に問題を解決しましsession.Clear()たが、この解決策は別のバグにつながります。Daniel の応答を読み、問題がストアド プロシージャにあることを検出するために提供したこの応答を読みました。ストアド プロシージャは一意の識別子を返さなかったので、ID を nhibernate にマップするとエラーが発生しました。

于 2016-05-17T20:24:22.597 に答える