29

既存のシステムと統合する給与計算システムを作成しています。元のシステムには、ユーザー管理と一部のグローバル構成を処理するマスター データベースがありました。その下には、それぞれ構造が同一の複数のデータベースがあり、基本的に各データベースは 1 つの会社の給与データベースであり、親データベースに属しているため、これらはすべてメイン データベースに関連付けられています。それぞれが独自の人事部門を持つ多くの子会社を持つ会社。

私が疑問に思っていたのは、Cookie または接続先の会社を保存する別の方法に基づいて、フィルターを使用した入力に基づいてエンティティ フレームワークのターゲット データベースを動的に変更できる方法があるかどうかということです。

次に例を示します。

ユーザー A がサイトにログインし、ユーザーがアクセス許可を持つ利用可能な会社がページに読み込まれ、ユーザーが会社を選択し、その会社の管理者権限を持ち、従業員を追加し、そのアクションが実行される前に、asp.net接続文字列を適切なデータベースに切り替えてから、レコードを追加します。

4

2 に答える 2

27

とてもシンプルです。私は持っている:

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in     web.config also the name of Entitiframework
{
}

edmx フォルダーの自動生成された Model.Context.cs に既にあります

実行時に複数のデータベースに接続するために、同じファイル Model.Context.cs で以下のように接続文字列をパラメーターとして受け取る別のコンストラクターを作成しました

public WMSEntities(string connStringName)
    : base("name=" + connStringName)
{
}

たとえば、Web.Configに他の接続文字列を追加しました

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/>

<add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/>

次に、データベースに接続するときに、以下のメソッドを呼び出して、connetionString 名をパラメーターとして渡します

public static List<v_POVendor> GetPOVendorList(string connectionStringName)
{
    using (WMSEntities db = new WMSEntities(connectionStringName))
    {               
        vendorList = db.v_POVendor.ToList();                 
    }
}
于 2014-01-03T01:55:44.280 に答える
7

EF6 では、同じコンテキストからの複数の DB アクセスがより適切にサポートされています。これは EF5 のスニペットです。事前にデータベース初期化子の設定を管理することが重要です。移行をトリガーしたくない場合があります。つまり、これを前に使用します

Database.SetInitializer(new ContextInitializerNone<MyDbContext>());

しかし、質問に答えるには:はい、できます

var conn = GetSqlConn4DbName(dataSource,dbName );
var ctx = new MyDbContext(conn,true);



public DbConnection GetSqlConn4DbName(string dataSource, string dbName) {
        var sqlConnStringBuilder = new SqlConnectionStringBuilder();
        sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;
        sqlConnStringBuilder.IntegratedSecurity = true;
        sqlConnStringBuilder.MultipleActiveResultSets = true;

        var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);
        var sqlConn = sqlConnFact.CreateConnection(dbName);
        return sqlConn;
    }


 public class ContextInitializerNone<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext
{
    public void InitializeDatabase(TContext context) {  }
}

移行、サンプル コード、動的データベース接続を使用した StackOverflow の回答も参照してください。

于 2013-08-05T10:54:03.697 に答える