我插入数据并获取返回的ID后如何修复DapperExtensions错误

时间:2019-05-17 20:18:54

标签: c# dapper dapper-extensions

我使用 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”。

我该如何解决?

2 个答案:

答案 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;

后,问题已解决