【发布时间】:2020-03-22 14:00:36
【问题描述】:
我有两个表Partners 和Partner_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。正如我所说,这些就像绝望的举动,因为我没有更多的想法可以尝试。
-
为什么您的查询与您的插入不在同一个事务中?这很可能是问题所在。