我正在尝试使用DbMigrator
中的EntityFramework
类以编程方式初始化SQL Server数据库:
var configuration = new MyDataBaseAssembly.Migrations.Configuration();
configuration.TargetDatabase = new System.Data.Entity.Infrastructure.DbConnectionInfo(myConnectionString, "System.Data.SqlClient");
var dbMigrator = new DbMigrator(configuration);
dbMigrator.Update();
using (var context = new MyDataBaseAssembly.MyDataBaseContext(myConnectionString))
{
// do some queries
context.MyTable1.ToList();
}
奇怪的是,代码适用于我的所有数据库程序集,除了一个。由于某种原因,其中一个DB没有初始化,我收到一个例外:
System.Data.SqlClient.SqlException: Invalid object name 'dbo.MyTable1'.
当我打开SQL Server Profiler时,我可以看到正在应用所有迁移而没有错误。但是,当我在SQL Server Management Studio中打开数据库时,我可以看到它根本不包含任何表。
在进一步调查之后,我发现在执行dbMigrator.Update
之后,它使用的事务没有提交给事务仍处于打开状态的DB(DBCC OPENTRAN
输出)。出于某种原因,在我尝试使用MyDataBaseContext
进行一些查询之前,事务数据被丢弃。
这种行为的原因是什么?为什么dbMigrator.Update
为某些数据库提交所有必要的迁移,而不为其他数据库提交?我可以手动控制dbMigrator
个事务并强制它们提交吗?
答案 0 :(得分:0)
我遇到了同样的问题。我最终用
解决了这个问题var scriptor = new MigratorScriptingDecorator(dbMigrator);
var script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null);
using (var conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(script, conn))
{
cmd.ExecuteNonQuery();
}
}