C#Dapper get last insert id返回null MySQL

C#Dapper get last insert id返回null MySQL,c#,mysql,database,dapper,C#,Mysql,Database,Dapper,我有两个表Partners和Partner\u Address,我想在另一个数据库中存储合作伙伴地址。为此,我在Dapper中使用Transaction 在执行查询以插入新的合作伙伴之后,我尝试获取最后一个insert id,然后将该id传递给address对象,但每次都得到0。已成功插入合作伙伴记录,但上次插入id为0 表格: // Partner Address entity public class AdreseKorisnika { public int id { get

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

在执行查询以插入新的
合作伙伴之后,我尝试获取最后一个insert id,然后将该id传递给address对象,但每次都得到
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;
    }
}
我的尝试:

// 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;
    }
}
public int insertwithaddress(合作伙伴,AdreseKorisnika-AdreseKorisnika)
{                
使用(康涅狄格州)
{
字符串partnerQuery=@“插入合作伙伴(naziv、pib、maticni\u br、telefon、电子邮件、web\u sajt、状态、已创建)
价值观(@naziv、@pib、@maticni_br、@telefon、@email、@web_sajt、@status、@created);”;
string addressQuery=@“插入到Adrese_Korisnika中(partnerId、adresaId、broj、status、primarna)
价值观(@partnerId、@adresay、@broj、@status、@primarna);“;
int affectedRows=0;
使用(var transaction=Conn.BeginTransaction())
{
affectedRows=Conn.Execute(partnerQuery,partner,transaction:transaction);
int id=Conn.Query(“选择最后一个插入的id()”).First();
var addrs=Conn.ExecuteScalar(addressQuery,
新的
{

partnerId=id,//我解决了如下问题:

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

}
public int insertwithaddress(合作伙伴,AdreseKorisnika-AdreseKorisnika)
{                
使用(康涅狄格州)
{
字符串lastInsertID=@”
插入合作伙伴(naziv、pib、maticni\u br、telefon、电子邮件、网络、状态、已创建)
价值观(@naziv、@pib、@maticni_br、@telefon、@email、@web_sajt、@status、@created);
插入Adrese_Korisnika(partnerId,Adresay,broj)
值(最后插入的ID(),@adresayd,@broj);
选择强制转换(最后一次插入ID()为无符号整数);“;
使用(var transaction=Conn.BeginTransaction())
{
var affectedRows=Conn.Query(lastInsertID,
新的
{
naziv=partner.naziv,
pib=partner.pib,
maticni\u br=合伙人。maticni\u br,
telefon=partner.telefon,
email=partner.email,
web_sajt=partner.web_sajt,
status=partner.status,
created=partner.created,
adresayd=adreseKorisnika.adresayd,
broj=adreseKorisnika.broj,
},
交易:交易);
返回1;
};
}
}

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