5

同一のスキーマを持つ複数のデータベースがある状況がありますが、それぞれに異なるデータがあります。これを処理するために、単一のセッション ファクトリを作成しています。

問題は、どのデータベースに接続するかが実行時までわからないことです。ただし、起動時にファクトリ ビルドを取得するには、そのスキーマを使用してデータベースに接続する必要があります。現在、既知の場所にスキーマを作成してそれを使用することでこれを行っていますが、その要件を削除したいと考えています。

接続を指定せずにセッション ファクトリを作成する方法を見つけることができませんでした。パラメータなしで OpenSession メソッドを使用できるとは思っていませんが、それは問題ありません。

何か案は?ありがとうアンディ

4

4 に答える 4

2

独自に実装するかIConnectionProvider、独自の接続を に渡しますISessionFactory.OpenSession(IDbConnection)(ただし、接続追跡に関するメソッドのコメントを読んでください) 。

于 2010-08-30T18:33:51.547 に答える
0

これには、bradygasterの優れたNuGetパッケージを使用することもできます。私は彼のNHQSパッケージから独自の実装を作成しましたが、それは非常にうまく機能します。

あなたはここでそれを見つけることができます:

http://www.bradygaster.com/Tags/nhqs

幸運を!

于 2012-02-07T12:49:41.300 に答える
0

私たちが思いついた解決策は、これを管理するクラスを作成することでした。クラスは、メソッド呼び出しの情報を使用してルーティングロジックを実行し、データベースの場所を特定してから、接続文字列を渡してOpenSessionを呼び出すことができます。

于 2011-03-29T23:57:58.213 に答える
0

これに出くわし、将来の読者のために私のソリューションを追加すると思いました。これは基本的に、CSの「切り替え」をカプセル化し、単一の管理ポイントを提供するMauricio Schefferが提案したものです(各セッション呼び出しに渡す必要があるよりも、これが好きです。 「ミス」して失敗します)。

クライアントの認証中に接続文字列を取得し、コンテキストを設定してから、次のIConnectinProvider実装を使用して、セッションが開かれるたびにCSにその値を設定します。

/// <summary>
/// Provides ability to switch connection strings of an NHibernate Session Factory (use same factory for multiple, dynamically specified, database connections)
/// </summary>
public class DynamicDriverConnectionProvider : DriverConnectionProvider, IConnectionProvider
{
    protected override string ConnectionString
    {
        get
        {
            var cxnObj = IsWebContext ?
                HttpContext.Current.Items["RequestConnectionString"]: 
                System.Runtime.Remoting.Messaging.CallContext.GetData("RequestConnectionString");

            if (cxnObj != null)
                return cxnObj.ToString();
            //catch on app startup when there is not request connection string yet set
            return base.ConnectionString;
        }
    }

    private static bool IsWebContext
    {
        get { return (HttpContext.Current != null); }
    }
}

次に、NHConfig中に配線します。

var configuration = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2005
                            .Provider<DynamicDriverConnectionProvider>() //Like so
于 2013-02-12T18:32:24.567 に答える