我有一个以BIGINT列为主键的MySQL表,自动增量值目前为9888008450(明显大于32位数)。
当我从Dapper.Contrib调用insert函数时,它抛出异常:
对于Int32,值太大或太小。
此问题仅发生在insert函数中。获取,插入和删除功能可以正常工作。
这是我的测试应用程序:
static void Main(string[] args)
{
using (var conn = new MySqlConnection(connString))
{
try
{
conn.Execute("DROP TABLE IF EXISTS Test;");
conn.Execute("CREATE TABLE Test (AccountNumber BIGINT(20) PRIMARY KEY AUTO_INCREMENT,Name VARCHAR(50) NOT NULL);");
conn.Execute("ALTER TABLE Test AUTO_INCREMENT = " + ((long)int.MaxValue + 1));
var test = new Test { Name = "Test Name" };
conn.Insert(test);
Console.WriteLine(test.AccountNumber);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Console.ReadKey();
}
这是Dapper.Contrib的错误还是我需要在代码中更改某些内容?
修改
刚刚找到这个GitHub Pull Request
看起来没有立即解决此问题的计划。
我在我的代码中创建了这个临时解决方法,如果有人有更好的建议,我一定会很感激:
public static long Insert<T>(T entity) where T : class
{
try
{
conn.Insert(entity);
}
catch (OverflowException ex)
{
if (ex.TargetSite.DeclaringType == typeof(Convert) && ex.TargetSite.Name == "ToInt32")
return conn.QuerySingle<long>("SELECT LAST_INSERT_ID();");
}
}