У меня есть две таблицы 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

ОБНОВЛЕНИЕ Таблица БД

enter image description here

< Сильный > DEBUG

enter image description here

-1
Ivan 22 Мар 2020 в 17:00
2
Насколько я знаю, этот код должен работать, если в таблице Partner установлен идентификатор AUTOINCREMENT. MySqlConnection также имеет нестандартное свойство LastInsertedId. Вы проверили, равно ли это свойство нулю?
 – 
Steve
22 Мар 2020 в 17:06
Это просто репрезентация сущности. Конечно, в моей таблице есть autoincrement
 – 
Ivan
22 Мар 2020 в 17:25
Я пытался воспроизвести вашу проблему, но я получаю правильное значение при каждой вставке. Я бы попытался (но только из-за лучших идей и только для исключения некоторых путей) удалить транзакцию и проверить, не изменилось ли что-то, и, в качестве второй попытки, я бы изменил тип хранилища с MyIsam на InnoDB. Как я уже сказал, это похоже на движения отчаяния, потому что у меня больше нет идеи попробовать.
 – 
Steve
22 Мар 2020 в 18:03
Почему ваш запрос не находится в той же транзакции, что и ваша вставка? Скорее всего проблема в этом.
 – 
Robert McKee
23 Мар 2020 в 09:20

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

}
0
Palle Due 23 Мар 2020 в 13:22