25

複数のデータベースで同じデータベーススキーマを使用するアプリに取り組んでいます。このため、私はというデータベースを作成しましたMyTemplate。新しいユーザーが作成されると、データベースの独自のインスタンスが作成されます。そのため、のようなデータベースMyTemplate_[UserName]が作成されます。ユーザーがログインするとき、私は彼らのクエリを彼らのデータベースに向ける必要があります。このため、実行時に接続文字列を設定する必要があることを知っています。私の問題は、EntityFrameworkも使用したいということです。

現在、MyTemplateをソースとして使用して新しい.edmxを作成しました。コードを更新して、そこに接続文字列を設定できると思いました。残念ながら、設定方法がわかりません。TemplateEntitiesのコンストラクターには、接続文字列を渡すことができるオーバーロードがありません。DbContextから派生したTemplateEntitiesに気づきましたが、これが問題になるとは思いません。

string connectionString = GetUsersConnectionString();
using (TemplateEntities entities = new TemplateEntities())
{
  TemplateEntity entity = new TemplateEntity();

  // Save to the database
  entities.TemplateEntity.Add(entity);
  entities.SaveChanges();
}

.edmx間違って作成していますか?それとも私は何かを完全に見逃していますか?私のグーグルはすべて、渡される接続文字列を許可するはずのオーバーロードを示しています。しかし、私はそのオーバーロードを利用できません。

4

3 に答える 3

44

生成されたTemplateEntitiesクラスは としてマークされpartialます。

必要なのは、使用するコンストラクターを公開する部分クラス定義の別の部分を含む別のファイルを追加することだけです。

partial class TemplateEntities
{
  public TemplateEntities( string nameOrConnectionString )
    : base( nameOrConnectionString )
  {
  }
}

次に、接続文字列をこのコンストラクターに渡します。

edmx モデルを更新するときに上書きされないように、このコードを別のファイルに配置します。

于 2013-01-21T14:32:19.083 に答える
17

Nicholas Butler の答えはかなり正しいです。彼が言ったことに加えて、エンティティ フレームワークの既存の接続文字列を取得し、それを同じ構造を持つ別のデータベースに向けるという問題に直面しました。次のコードを使用して、既存の文字列のデータ ソースのみを変更しました。

var originalConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CSName"].ConnectionString;
var ecsBuilder = new EntityConnectionStringBuilder(originalConnectionString);
var sqlCsBuilder = new SqlConnectionStringBuilder(ecsBuilder.ProviderConnectionString)
{
    DataSource = "newDBHost"
};
var providerConnectionString = sqlCsBuilder.ToString();
ecsBuilder.ProviderConnectionString = providerConnectionString;

string contextConnectionString = ecsBuilder.ToString();
using (var db = new SMSContext(contextConnectionString))
{
    ...
}
于 2013-12-11T21:04:41.667 に答える