1

(NHibernateを使用して)データベースに接続するよりも、データベースに接続するためのいくつかの設定をユーザーに要求するWPFアプリケーションがあり、すべてが正しい場合は、メインビューを表示します。接続にエラーがある場合は、エラーの内容をユーザーに伝えて、再試行させたいと思います。これが私が望むことをするいくつかの単純化されたコードです:

編集 :

問題はNHibernateだけにあるのではないようです。ここで単純なアプリを実行すると、コンストラクターで未処理の例外が発生します。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        bool retry;

        do
        {
            retry = false;
            Window1 view = new Window1();

            try
            {
                throw new Exception("Test message");
                view.ShowDialog();
            }
            catch (Exception iException)
            {
                MessageBox.Show(iException.ToString());
                retry = true;
            }
            finally
            {
                view.Close();
            }
        }
        while (retry);
    }
}

私は例外を取得して未処理にしますが、テストメッセージが表示されるので、実際には例外です(try / catchブロック内にある場合でも)。例外が発生したときに中断すると、Window1のコンストラクター内で発生したことが通知されます。Window1にはバインディングまたはコントロールは含まれていません。Visual Studio 2008で新しいWPFアプリケーションを作成した場合に作成されるのは基本的なWindow1です。このバグを2台のコンピューターで再現しました(新しいWPFアプリケーションを作成し、このコードをApp.xaml.csに貼り付けるだけです)。

みなさん、ありがとうございました

4

6 に答える 6

1

ウィンドウを1回だけ(ループの前に)作成することで問題を解決しました。finallyブロックで閉じる代わりに、Hideを呼び出し、ループの後でのみ閉じます。

于 2011-06-10T13:56:16.833 に答える
0

発生する可能性のある例外はいくつもある可能性があり、例外の詳細を投稿しないと、診断が非常に困難になります。

推測すると、ビューがキャッチされていないと言うので、view.Close()がスローされていると推測されます。

于 2011-06-09T19:43:50.207 に答える
0

catchステートメントでsession.clear()を呼び出してみてください。

Nhibernateは、データベースに書き込む(フラッシュする)までSQLをバッファリングし続けます。問題(例外)がある場合は、例外が発生した時点ではなく、セッションがフラッシュされたとき(SQLをDBに書き込もうとしたとき)にスローされます。

NHibernateの例外を投稿してください、私はこれでかなり離れている可能性があります。

于 2011-06-09T19:49:19.393 に答える
0

セッションファクトリと構成を一度だけ構築する必要があります。グローバルオブジェクトにすることができます。次に、ループを通過するたびに、セッションファクトリにセッションを起動させます。セッションファクトリを破棄することは決してないので、別のセッションファクトリを構築すると、1つの構成で1つのセッションファクトリのみが必要になるため、nhibernateが台無しになります。

于 2011-06-09T19:50:11.903 に答える
0

コードを使用すると、「System.InvalidOperationException:アプリケーションオブジェクトがシャットダウンされています」というメッセージが表示されます。窓から-それは正しい例外のようです。ウィンドウは、リソースの読み込み中にインスタンス化が完了する前に、アプリから閉じるように通知されます。

問題の解決策は、スタートアップで例外が発生しなかったことがわかるまで、ウィンドウの作成を待つことです。

また、finallyパーツを変更して、代わりにクローズをディスパッチして、ウィンドウの初期化がクローズする前に終了するようにすることもできます。ディスパッチ優先度をロードしてみます。

リリースビルドで実行すると、無限ループが発生します。

于 2011-06-09T20:55:46.943 に答える
0

WPFランタイムがOnStartup()メソッド中にウィンドウを作成する準備ができているとは思いません。このメソッドは通常、アプリケーションのコンテキストを初期化するために使用されます。初期ウィンドウは通常、App.xamlのタグでStartupUriとして指定されます。

コードをリファクタリングして、代わりにStartupUriを使用してランタイムによってWindow1()が作成されるようにしてください。

于 2011-06-10T05:09:10.550 に答える