WPF と Entity Framework CodeFirst でアプリケーションを開発しています。
要件の 1 つは、ユーザーが新しいプロジェクトごとに個別のデータベース ファイルを作成できることです。
DbContext :
public class TestContext : DbContext, IUnitOfWork
{
public TestContext()
: base("TestContext")
{
}
#region Implementation of IUnitOfWork
public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
{
return base.Set<TEntity>();
}
#endregion Implementation of IUnitOfWork
public DbSet<Destination> Destinations { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new DestinationMap());
}
app config で定義された接続文字列:
<connectionStrings>
<clear />
<add name="TestContext" providerName="System.Data.SqlClient" connectionString="Server=.\sqlexpress;Database=databaseName;Integrated Security=True;Connect Timeout=300;MultipleActiveResultSets=true;" />
</connectionStrings>
StructureMap を使用して IUnitOfWork インターフェイスに DbContext を挿入し、リクエスト パターンごとにコンテキストを実装しました。これは StructureMap 構成です:
ObjectFactory.Initialize(x => x.Scan(scanner =>
{
x.For<IUnitOfWork>().CacheBy(InstanceScope.Hybrid).Use<SpitfireContext>();
}));
ユーザーが新しいプロジェクトを作成するときに、接続文字列を変更して、アプリケーションに新しいプロジェクトのデータベースを強制的に作成しようとします。
public static void ChangeDatabase(Guid guid)
{
var sqlConnectionStringBuilder =
new SqlConnectionStringBuilder(ConfigHelper.ActiveConnection);
sqlConnectionStringBuilder["Database"] = guid.ToString();
ConfigHelper.ActiveConnection = sqlConnectionStringBuilder.ToString();
Database.DefaultConnectionFactory =
new System.Data.Entity.Infrastructure.SqlConnectionFactory(ConfigHelper.ActiveConnectionString());
Database.SetInitializer(
new MigrateDatabaseToLatestVersion<TestContext, MigrationConfiguration>());
using (var context = new TestContext())
{
context.Database.Initialize(true);
}
}
アプリケーションは最初のプロジェクトのデータベースを作成し、その後、プレビュー データベースの移行を試みます。
コードで DbConext オブジェクトを直接作成しないため、接続文字列をそのコンストラクターに渡すことができません。
私の問題に対して何を提案しますか?
私のコードの何が問題になっていますか?