2

私は Fluent NHibernate を使用しており、現在、同じテーブルが複数の MSSQL データベースに存在するアーカイブ データを操作する必要があります。ユーザーが提供した日付値に応じて、別のデータベースに接続する必要がありますが、マッピング情報はすべて同じままです。

より具体的に: 指定された Date 値が現在の年内にある場合は DBCURを使用し、そうでない場合は年次 DB (2011、2010、2009、...) を使用します。

以前、SessionFactory を何度も再作成するのは非常にコストがかかると人々から言われたことがあります。そのため、既存の sessionFactory を使用して ClassMap を更新する (変更のようなもの) 方法が必要であると考えました。 「CUR.DBO」から「2011.DBO」へのスキーマ) と再接続します。

FluentConfiguration と SessionFactory の両方をいじってみましたが、実行時にマッピングを更新する方法を見つけることができず、ひざまずいてしまいました。

新しい SessionFactory を作成することになりますか? または、実行時に (Fluent) NHibernate のマッピングを再初期化するための実行可能な手順を知っている人はいますか?

編集: 1 つの非常に重要な詳細、SqlConnection も外部で提供されます。すべてのデータベースへのアクセスを提供します。つまり、理論的には、接続を作成する必要はありません。したがって、基本的に私がしなければならないことは、アーカイブごとに SessionFactory を作成して、別のデータベースを指すマッピングのスキーマ情報を更新することです。しかし、これはまさに私が立ち往生しているところです。

4

3 に答える 3

1

返信/コメントありがとうございます。実際、私はセッション ファクトリを再利用する方法を見つけられなかったので、提案どおりにルックアップ リストを作成することになりました。次のソリューションは、私が必要とすることを行います (データベースを変更します)。

    private IDictionary<string, ISessionFactory> _sessionFactories;

    public SqlConnection Connection { get; set; }

    public ISessionFactory GetSessionFactory(string dbName)
    {
        if (_sessionFactories.ContainsKey(dbName))
        {
            return _sessionFactories[dbName];
        }

        FluentConfiguration cfg = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
                                                                .ShowSql()
                                                                .ConnectionString(c=>c.Is(Connection.ConnectionString)))
                                                      .Mappings(x=>x.FluentMappings.Add<MappedClassMap>());
        cfg.ExposeConfiguration(x => x.GetClassMapping(typeof(MappedClass)).Table.Schema = string.Format("{0}.dbo",dbName));
        ISessionFactory sf = cfg.BuildSessionFactory();
        _sessionFactories.Add(dbName, sf);
        return sf;
    }
于 2012-04-16T07:04:47.073 に答える
1

確かに、セッション ファクトリの作成は、セッションの作成よりもはるかにコストのかかる操作です。そのため、データベースへのすべてのクエリに対してセッション ファクトリを作成する必要はありません。

ただし、私の経験では、せいぜい数秒しかかかりません。

ユーザーが別の年を選択するたびに、新しい年を作成することをお勧めします。これが発生している間に良いフィードバックを提供すれば (おそらく、「2010 データベースに接続しています」などのダイアログとプログレス バーが表示されます)、彼らはおそらく待つことを気にしません。

そして、1 年間作成したものは、同じ年にさらにクエリを実行する場合に再利用できるため、1 年に 1 回クエリを待つだけで済みます。

セッション ファクトリの作成に時間がかかりすぎる場合は、作成時間を短縮するために構成を保存またはキャッシュする方法を説明する投稿を見たことがあります。ただし、簡単なグーグル検索では適切なリンクが見つからないため、それを調査するか、別の質問をする必要があるかもしれません.

于 2012-04-13T15:10:29.083 に答える