1

これが私の基本的な状況です。NHibernate を使用して、データベースから情報を取得し、マッピングに基づいていくつかのオブジェクトを作成し、それらをシリアル化し、シリアル化されたオブジェクトをフラッシュ コンポーネントに移動しようとしています。ビルド エラーは発生していませんが、「シリアル化された」オブジェクトを返すと、null が返され続けます。いくつかのブレークポイントを挿入してステップスルーすると、すべてが南に向かっていることに気付きました。

ここにブレークポイントを置きます:

var tasks = (List<CSH_Task>)persistanceManager.RetrieveAll<CSH_Task>(SessionAction.BeginAndEnd);

そして、PersistanceManager クラスに入り、CSH_Task を正常に渡します。

public IList<T> RetrieveAll<T>(SessionAction sessionAction)
    {
        /* Note that NHibernate guarantees that two object references will point to the
         * same object only if the references are set in the same session. For example,
         * Order #123 under the Customer object Able Inc and Order #123 in the Orders
         * list will point to the same object only if we load Customers and Orders in 
         * the same session. If we load them in different sessions, then changes that
         * we make to Able Inc's Order #123 will not be reflected in Order #123 in the
         * Orders list, since the references point to different objects. That's why we
         * maintain a session as a member variable, instead of as a local variable. */

        // Open a new session if specified
        if ((sessionAction == SessionAction.Begin) || (sessionAction == SessionAction.BeginAndEnd))
        {
            m_Session = m_SessionFactory.OpenSession();
        }

        // Retrieve all objects of the type passed in
        ICriteria targetObjects = m_Session.CreateCriteria(typeof(T));
        IList<T> itemList = targetObjects.List<T>();

        // Close the session if specified
        if ((sessionAction == SessionAction.End) || (sessionAction == SessionAction.BeginAndEnd))
        {
            m_Session.Close();
            m_Session.Dispose();
        }

        // Set return value
        return itemList;
    }

これは、NHibernateの古い例から直接引用したものです (私は非常に新しいものです)。そして、これを一覧表示する「利用可能なソースがありません」ページに移動します。

コール スタックの場所:

Iesi.Collections.DLL!Iesi.Collections.Generic.HashedSet.HashedSet() 18 行目

ソースファイル情報:

「d:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs」のソースを検索しています。チェックサム: MD5 {d3 1c 6c 95 94 c0 cb d4 b5 8d 8c 42 c5 4a 37 b2}

ファイル 'd:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs' は存在しません。

「d:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs」のスクリプト ドキュメントを検索しています...

プロジェクトで「d:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs」を探します。

プロジェクト内にファイルが見つかりませんでした。

ディレクトリ 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\' を探しています...

ディレクトリ 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc\' を探しています...

ディレクトリ 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\src\atl\' を探しています...

ディレクトリ 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\' を探しています... ディレクトリ 'C:\Users\tackiean\Desktop\' を探しています...

ディレクトリ 'E:\SmartMC\NHibernate\Required_Bins\' を探しています...

ソースは「E:\SmartMC\NHibernate\Required_Bins\HashedSet.cs」で見つかりました。

次の場所のチェックサムが一致するかどうかを判断します。

1:E:\SmartMC\NHibernate\Required_Bins\HashedSet.cs チェックサム: MD5 {40 1b 39 7e 8f 4a 3f 6 11 41 88 70 9e 8f 8 f1} チェックサムが一致しません。

アクティブなソリューションのデバッグ ソース ファイルの設定は、デバッガーがユーザーにファイルの検索を要求しないことを示しています: d:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs。

デバッガーは、ソース ファイル 'd:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs' を見つけることができませんでした。

ステップを進めていくと、コードに戻ります。ここに戻ると、DictionarySet.cs に関するほぼ同じメッセージが表示されます。

そもそもこのマシンでこのプロジェクト用に NHibernate をダウンロードしたのは私ではありませんが、HashedSet.cs/DictionarySet.cs が機能するために必要な場合、デフォルトで含まれているはずだと想像していました。私は今日、これに対する答えを探すのに約 7 時間費やしましたが、何も出てきません。このようなエラーは今まで見たことがありません。NHibernate が必要としていて見つからないファイルを探しているだけだと思いますが、ここで何か他のことが起こっていますか? どんな助けでも大歓迎です。これが適切な場所/読みやすい形式であることを願っています。ここで質問したことがないので、完全に不適切でないことを願っています。

4

2 に答える 2

0

HashedSetとDictionarySetは、NHibernateに含まれているコレクションライブラリであるIesi.Collectionsの一部です。NHibernateのバイナリパッケージには通常、アセンブリのデバッグ情報を含む.pdbファイルが含まれています。デバッガーがソースファイルを開きたい場合、含まれているソースパスはパッケージメンテナーのパスであるため、マシン上でそれらを見つけることができません。

必要に応じて、 GitHubでNHibernateソースをダウンロードし、自分でアセンブリをコンパイルできます。その後、例外が発生すると、デバッガーはソースファイルを自動的に検出します(コンパイル後にソースファイルを移動しないでください)。

常にセッションを開いてどこかで閉じる必要があるため、RetrieveAllメソッドを少し変更する必要があります。通常、次のようなことを行います。

using (ISession sess = factory.OpenSession())
using (ITransaction tx = sess.BeginTransaction())
{
    try
    {
        var crit = sess.CreateCriteria<T>();
        var list = crit.List<T>();

        // Do something with list

        tx.Commit();
    }
    catch (Exception)
    {
        tx.Rollback();
    }
}

照会されたリストを発信者に返したい場合、セッションは閉じられます。したがって、クエリされたリストに初期化されていない遅延読み込みプロキシが残っていないことを確認してください。NHibernateのドキュメントの遅延/熱心な読み込みのセクションを読むことができます。うまくいけば、私はあなたの問題を少し助けることができます。

于 2012-05-16T17:30:15.250 に答える
0

表示されるメッセージは、デバッガーがソース コードをステップ実行しているため、ソース コードを見つけようとしていることを示しています。マシンにそのソース コードがなくても、NHibernate ランタイムには影響しません。

于 2012-05-17T10:49:28.533 に答える