我正在尝试使用 EntityFramework
中的 DbMigrator
类以编程方式初始化 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();
}
奇怪的是代码对我的所有数据库程序集都没有问题,只有一个除外。由于某种原因,其中一个数据库没有被初始化,我收到了一个异常:
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
事务并强制它们提交吗?
最佳答案
我遇到了同样的问题。我最终解决了这个问题
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();
}
}
关于c# - DbMigrator 不提交对数据库的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42362407/