c# - DbMigrator 不提交对数据库的更改

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

我正在尝试使用 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/

相关文章:

c# - 数据网格模板 [WPF]

路由中的 C# WebAPI 核心反斜杠

c# - 在代码隐藏中向 Asp ListBox 列表项添加属性时出现问题

mysql - 存储过程中的日期部分

entity-framework - EF Code First 级联删除不起作用

c# - 使用现有的 C# 模型类构建实体图 (.EDMX)

c# autoclose 窗口 sleep 但文本消失

c# - 为什么 "ORDER BY"会破坏我的查询?

c# - SQL 数据库的 "developer/test"模式

sql-server - 是否可以将 ndf 文件和 mdf 文件合并为一个 mdf 文件?