EntityFramework 代码优先的自定义连接字符串和迁移 [英] EntityFramework code-first custom connection string and migrations
问题描述
当我使用默认连接字符串(从 app.config
读取)创建上下文时,会创建数据库并且迁移工作 - 基本上一切正常.而当以编程方式创建连接字符串时(使用 SqlConnectionStringBuilder
):
When I create a context with a default connection string (as read from the app.config
) the database is created and the migrations work - basically everything is in order. Whereas when the connection string is created programatically (using SqlConnectionStringBuilder
):
- 当数据库不存在时不创建数据库(场景
A
); CreateDbIfNotExists()
创建最新版本的数据库模型,但迁移机制未被调用(场景B
).
- database isn't created when the database is not present (scenario
A
); CreateDbIfNotExists()
creates the newest version of database model but the migration mechanisms are not invoked (scenarioB
).
在 A
中,当我希望访问数据库时会抛出异常,因为 - 显然 - 它不存在.在B
数据库中创建了正确的迁移机制没有调用,就像标准连接字符串中的情况一样.
In A
an exception is thrown when I wish to access the database, as - obviously - it isn't there. In B
database is created properly migration mechanisms are not called, as is the case in standard connection string.
app.config:"Data Source=localhost\SQLEXPRESS;Initial Catalog=Db13;User ID=xxx;Password=xxx
"
建造者:
sqlBuilder.DataSource = x.DbHost;
sqlBuilder.InitialCatalog = x.DbName;
sqlBuilder.UserID = x.DbUser;
sqlBuilder.Password = x.DbPassword;
初始化器:
Database.SetInitializer(
new MigrateDatabaseToLatestVersion<
MyContext,
Migrations.Configuration
>()
);
规格:实体框架:5.0,数据库:SQL Server Express 2008
Specs: Entity Framework: 5.0, DB: SQL Server Express 2008
推荐答案
如果您的迁移无法正常工作,请尝试在 DbContext ctor 中设置 Database.Initialize(true)
.
If your migration does not work correctly try to set Database.Initialize(true)
in DbContext ctor.
public CustomContext(DbConnection connection)
: base(connection, true)
{
Database.Initialize(true);
}
我有类似的迁移问题.在我的解决方案中,我必须始终在 ctor 中设置数据库初始值设定项,如下所示
I have similar problem with migrations. And in my solution I have to always set database initializer in ctor, like below
public CustomContext(DbConnection connection)
: base(connection, true)
{
Database.SetInitializer(new CustomInitializer());
Database.Initialize(true);
}
在自定义初始值设定项中,您必须实现 InitalizeDatabase(CustomContex context)
方法,例如.
In custom initializer you have to implement InitalizeDatabase(CustomContex context)
method, eg.
class CustomInitializer : IDatabaseInitializer<CustomContext>
{
public void InitializeDatabase(CustomContext context)
{
if (!context.Database.Exists || !context.Database.CompatibleWithModel(false))
{
var configuration = new Configuration();
var migrator = new DbMigrator(configuration);
migrator.Configuration.TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString, "System.Data.SqlClient");
var migrations = migrator.GetPendingMigrations();
if (migrations.Any())
{
var scriptor = new MigratorScriptingDecorator(migrator);
string script = scriptor.ScriptUpdate(null, migrations.Last());
if (!String.IsNullOrEmpty(script))
{
context.Database.ExecuteSqlCommand(script);
}
}
}
}
}
更新
这篇关于EntityFramework 代码优先的自定义连接字符串和迁移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!