【问题标题】:C# Dapper get last insert id returns null MySQLC# Dapper 获取最后一个插入 id 返回 null MySQL
【发布时间】:2020-03-22 14:00:36
【问题描述】:

我有两个表PartnersPartner_Address,我想将合作伙伴地址存储在另一个数据库中。为此,我在Dapper 中使用Transaction

在执行插入新partner 的查询后,我尝试获取最后一个插入ID,然后将该ID 传递给地址对象,但我一直得到0。已成功插入合作伙伴记录,但最后插入 id 为 0

表格:

// Partner Address entity

public class AdreseKorisnika   
{
    public int id { get; set; }
    public int partnerId { get; set; }  // partnerID
    public int adresaId { get; set; }  // addressID
    public string broj { get; set; }  // number
    public int status { get; set; }
    public int primarna { get; set; } // primary
}


public class Partner
{
    public int id { get; set; }
    public string naziv { get; set; }   // name        
    public string telefon { get; set; }  // phone
    public string email { get; set; }
    /// etc...

我的尝试:

public int InsertWithAdresses(Partner partner, AdreseKorisnika adreseKorisnika)
{                
    using (Conn)
    {
        string partnerQuery = @"INSERT INTO Partner(naziv, pib, maticni_br, telefon, email, web_sajt, status, created) 
                                VALUES(@naziv, @pib, @maticni_br, @telefon, @email,@web_sajt, @status, @created);";

        string addressQuery = @"INSERT INTO Adrese_Korisnika(partnerId, adresaId, broj, status, primarna) 
                                VALUES(@partnerId, @adresaId, @broj, @status, @primarna);";
        int affectedRows = 0;

        using (var transaction = Conn.BeginTransaction())
        {
            affectedRows = Conn.Execute(partnerQuery, partner, transaction: transaction);

            int id = Conn.Query<int>("SELECT LAST_INSERT_ID();").First();

            var addrs = Conn.ExecuteScalar<int>(addressQuery, 
                new
                {
                    partnerId = id,  // <-- here I try to pass last insert id from partnerQuery but it is always 0
                    adresaId = adreseKorisnika.adresaId,
                    broj = adreseKorisnika.broj,
                    status = adreseKorisnika.status,
                    primarna = adreseKorisnika.primarna
                }, 
                transaction: transaction);

            transaction.Commit();
        }

        return affectedRows;
    }
}

我希望我的Partners 在另一个表中有一个或多个地址。我也试过这个: Dapper MySQL return value

更新

调试

【问题讨论】:

  • AFAIK 如果合作伙伴表的 ID 设置为 AUTOINCREMENT,该代码应该可以工作。 MySqlConnection 还有一个名为 LastInsertedId 的非标准属性。你检查过这个属性是否也为零吗?
  • 这只是实体表示。当然我的桌子有autoincrement
  • 我试图重现您的问题,但我在每次插入时都得到了正确的值。我会尝试(但只是出于更好的想法,只是为了排除一些路径)删除事务并检查是否有变化,作为第二次尝试,我会将存储类型从 MyIsam 更改为 InnoDB。正如我所说,这些就像绝望的举动,因为我没有更多的想法可以尝试。
  • 为什么您的查询与您的插入不在同一个事务中?这很可能是问题所在。

标签: c# mysql database dapper


【解决方案1】:

我解决了这样的问题:

public int InsertWithAdresses(Partner partner, AdreseKorisnika adreseKorisnika)
{                
    using (Conn)
    {
        string lastInsertID = @"
                            INSERT INTO Partner(naziv, pib, maticni_br, telefon, email, web_sajt, status, created) 
                            VALUES(@naziv, @pib, @maticni_br, @telefon, @email,@web_sajt, @status, @created);

                            INSERT INTO Adrese_Korisnika(partnerId, adresaId, broj) 
                            VALUES(LAST_INSERT_ID(), @adresaId, @broj);

                            SELECT CAST(LAST_INSERT_ID() AS UNSIGNED INTEGER);";


         using (var transaction = Conn.BeginTransaction())
         {
             var affectedRows = Conn.Query<int>(lastInsertID,
                 new
                 {
                     naziv = partner.naziv,
                     pib = partner.pib,
                     maticni_br = partner.maticni_br,
                     telefon = partner.telefon,
                     email = partner.email,
                     web_sajt = partner.web_sajt,
                     status = partner.status,
                     created = partner.created,
                     adresaId = adreseKorisnika.adresaId,
                     broj = adreseKorisnika.broj,

                },
                transaction: transaction);

            return 1;
        };
    }

}

【讨论】:

    猜你喜欢
    • 2016-06-27
    • 2011-06-01
    • 1970-01-01
    • 2014-06-19
    • 2012-04-05
    • 2017-03-26
    • 2023-03-16
    • 2011-04-30
    • 2011-11-06
    相关资源
    最近更新 更多