我使用 Dapper-Extensions 将数据提取并推入数据库
我在{strong>数据库和 class 中也使用unsigned int
id作为我的主键。
我的班级看起来像这样
public class Product {
[Column("id")]
public uint Id { get; set; }
}
我的Mapper类看起来像这样
public class ProductMap : ClassMapper<Product>
{
public ProductMap()
{
Table("Product");
this.Map(typeof(Product).GetProperty("Id")).Key(KeyType.Identity);
}
}
我这样插入数据
using DapperExtensions;
public virtual uint Add(T item)
{
using (conn)
{
return Convert.ToUInt32(conn.Insert<T>(item)); // System.ArgumentException: 'Object of type 'System.Int32' cannot be converted to type 'System.UInt32'.'`
}
}
当我向数据库中插入数据时,该项目被插入数据库中而没有问题,但是Insert函数不断返回以下错误:
'类型为'System.Int32'的对象不能转换为类型 “ System.UInt32”。
我该如何解决?
答案 0 :(得分:1)
正如您所说,INSERT操作进行得很好。然后,Dapper Extensions 提取新生成的身份值,并尝试将其分配给您的Product.Id
属性。
现在,返回值(列值)的数据类型为int
,该数据类型已签名。 Id
属性的数据类型是uint
,它是无符号的。尽管两种数据类型的长度相同,但是它们可以容纳的数据类型(有符号和无符号)却不同,因此会出现错误。
您应将Id
属性的数据类型更改为int
,如下所示:
public int Id { get; set; }
正如您在回答中所说,您必须保留属性uint
,以下是我的建议:
为班级添加一个额外的属性,如下所示:
public class Product {
[Column("id")]
public int Id { get; set; }//Map this as Identity.
public uint IdCopy { get { return Convert.ToUInt32(Id); } }//Readonly; Exclude this from mapping
}
答案 1 :(得分:0)
我确实需要将数据ID存储为uint
,并找到了解决该 int32 到 uint 转换错误的方法。
在DapperImplementor.cs class
中的函数public dynamic Insert<T> {...}
内
在将ID分配给相应的对象ID之前,有一个变量int identityInt = 0;
用于保存ID
我将其类型更改为uint identityInt = 0;