如何在 FluentMigrator 中获取最后插入的 id

Posted

技术标签:

【中文标题】如何在 FluentMigrator 中获取最后插入的 id【英文标题】:How to get last inserted id in FluentMigrator 【发布时间】:2021-05-14 10:34:07 【问题描述】:

我将 FluentMigrator 与 mysql 和 C# 一起使用。

[Migration(3)]
public class _0003_TestMigrationTI : Migration

    public override void Up()
    
        Insert.IntoTable("cmn_file_types").Row(new  Name = "Image", Code = "IMG" );

        ???
    

如何在 same Up() 方法中的 Insert.IntoTable 之后获取最后插入的 id? ID 是 cmn_file_types 表中的一个 INT PRIMARY AUTO_INCREMENT 列。

【问题讨论】:

这可能是一个重复的问题。这是我发现的搜索结果:***.com/questions/24167605/… 这能回答你的问题吗? How to retrieve inserted identity in migration of FluentMigrator 【参考方案1】:

MigrationBase 类具有 ConnectionsString 属性。只需使用它来创建您的 ADO.net 查询:

var builder = new SqlConnectionStringBuilder(ConnectionString);
var query = "SELECT IDENT_CURRENT('Table')"    

using (var connection = new SqlConnection(builder.ConnectionString))

    connection.Open();
    var command = new SqlCommand(query, connection);
    var lastId = command.ExecuteScalar();
    connection.Close();

更新:

试试这个。为我工作。在这里,您将获得与新查询相同的事务,这与 ADO 的情况不同。所以“选择 IDENT_CURRENT”会显示未提交的当前 ID。

Execute.WithConnection((IDbConnection connection, IDbTransaction transaction) =>
            
                var command = connection.CreateCommand();
                command.Transaction = transaction;
                command.CommandText = @"select IDENT_CURRENT('TestTable1')";
                var count = command.ExecuteScalar();
            );

【讨论】:

我在Insert.IntoTable后面加了这几行,但是lastId会是0。我想是因为insert是在其他事务上运行的,它会在Up方法之后提交。跨度> 是的,你是对的。错过了交易的那一刻。只记得我们可以使用 Execute.Sql。如果您找到如何获得价值,也许它会有所帮助。让我看看有没有可能

以上是关于如何在 FluentMigrator 中获取最后插入的 id的主要内容,如果未能解决你的问题,请参考以下文章

FluentMigrator - 检查列是不是存在跨数据库

使用FluentMigrator进行数据库迁移

数据库中如何查询表的最后一条记录?

开源的 .NET 数据库迁移框架

excel插入地图的问题

JS 如何动态插入表格