实体框架代码优先:为每个项目创建单独的数据库
本文关键字:项目 创建 单独 数据库 代码 框架 实体 | 更新日期: 2023-09-27 18:07:44
我正在用WPF和实体框架CodeFirst开发一个应用程序。
一个要求是用户可以为每个新项目创建单独的数据库文件。
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配置中定义的连接字符串:
<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);
}
}
应用程序只是为第一个项目创建数据库,然后尝试迁移预览数据库。
我不创建dbcontext对象直接在我的代码,所以我不能传递连接字符串到它的构造函数。
你对我的问题有什么建议?
我的代码有什么问题?
这是一个棘手的部分-更改连接字符串。它有点作用,但有问题。
昨天我们对那件事进行了长时间的讨论。看看我的这篇(和相关的)文章——它描述了基于类似方法的代码的一些麻烦的背景。如果需要的话,我愿意进一步帮助你,但我需要更多的信息……为什么说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工厂是有益的。
将在DbContext类上添加一个静态属性来存储数据库的名称(Initial Catalog),然后更改连接字符串,以便使用字符串插入数据库名称。格式的工作吗?
那么你可以在任何时候更改数据库名称,下次创建上下文时,它将指向一个新的目标。