C# Dapper получить последнюю вставку id возвращает ноль MySQL - PullRequest
0 голосов
/ 22 марта 2020

У меня есть две таблицы Partners и Partner_Address, я хочу сохранить адреса партнеров в другой базе данных. Для этого я использую Transaction в Dapper.

. После выполнения запроса на вставку нового partner я пытаюсь получить последний идентификатор вставки, а затем передать этот идентификатор объекту адреса, но все время получаю 0. Партнерская запись была успешно вставлена, но последний идентификатор вставки 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 возвращаемое значение

ОБНОВЛЕНИЕ DB table

enter image description here

ОТЛАДКА

enter image description here

1 Ответ

0 голосов
/ 22 марта 2020

Я решил проблему следующим образом:

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

}
...