DbMigrator不会提交对数据库的更改

时间:2017-02-21 08:41:19

标签: c# sql-server entity-framework ef-migrations

我正在尝试使用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个事务并强制它们提交吗?

1 个答案:

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