【问题标题】:DbMigrator does not commit changes to databaseDbMigrator 不提交对数据库的更改
【发布时间】:2023-03-18 04:32:01
【问题描述】:

我正在尝试使用来自EntityFrameworkDbMigrator 类以编程方式初始化 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 事务并强制它们提交吗?

【问题讨论】:

  • 我刚刚遇到了同样的问题。当我使用 MigratorScriptorDecorator 时,它不起作用。当我删除此代码时,它确实如此。

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


【解决方案1】:

我遇到了同样的问题。我最终解决了这个问题

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

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2013-12-20
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多