0

我正在使用 WPF 和实体框架 CodeFirst 开发应用程序。
一项要求是用户可以为每个新项目创建单独的数据库文件。
数据库上下文:

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());
    }

应用配置中定义的连接字符串:

<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 对象,因此我无法将连接字符串传递给它的构造函数。
你对我的问题有什么建议?
我的代码有什么问题?

4

2 回答 2

1

这是一个棘手的部分 - 更改连接字符串。它有点工作,但有问题。

昨天我们就此进行了长时间的讨论。看看我的这篇(和相关的)帖子——它描述了基于类似方法的代码问题的一些背景。

如果需要,我想进一步帮助你 - 但我需要更多信息......

为什么说I don't create DbConext object directly in my codes so I can't pass connection string to its constructor?你有TestContext- 为什么不通过那里?

另外我不确定是否设置DefaultConnectionFactory,我会重新检查。允许设置,但似乎只在应用启动时推荐,不确定。同时查找此链接(它适用于 EF6,但我认为代码类似 - 您可以查找源代码) - http://msdn.microsoft.com/en-US/data/jj680699

我们得出的结论是,在这种情况下使用 DbContext 工厂是有益的。

于 2013-04-07T23:36:15.853 回答
0

会在 DbContext 类上添加一个静态属性来存储数据库的名称(初始目录),然后更改连接字符串以便使用 string.Format 插入数据库名称吗?

然后,您可以在下次创建上下文时随时更改数据库名称,它将指向一个新目标。

于 2013-04-07T03:07:40.917 回答