C# 带VARCHAR主键的Dapper/SimpleCRUD插入引发FormatException-“;字符串的格式不正确";
我正在尝试使用dapper和simplecrud插入postgresql数据库 我的实体有一个VARCHAR主键,我理解这意味着我必须在POCO中包含[key]和[Required]标记C# 带VARCHAR主键的Dapper/SimpleCRUD插入引发FormatException-“;字符串的格式不正确";,c#,postgresql,dapper,npgsql,dapper-simplecrud,C#,Postgresql,Dapper,Npgsql,Dapper Simplecrud,我正在尝试使用dapper和simplecrud插入postgresql数据库 我的实体有一个VARCHAR主键,我理解这意味着我必须在POCO中包含[key]和[Required]标记 [Table("tube_data")] class Tube : IEntity { //my primary key (name matches column name) [Dapper.Key] [Dapper.Required] public string tube_nr {
[Table("tube_data")]
class Tube : IEntity
{
//my primary key (name matches column name)
[Dapper.Key] [Dapper.Required]
public string tube_nr { get; }
//Constructors (probably not important)
private Tube()
{
}
public Tube(string tube_nr)
{
this.tube_nr = tube_nr;
}
//more code... just nullable properties (ints, floats and strings)
}
当我使用
_conn.Insert<Tube>(t);
\u连接插入(t);
我得到一个System.FormatException。“字符串格式不正确”。查看堆栈跟踪,我可以看到Dapper正在调用System.Convert.ToInt64()
我还有其他具有自动递增主键的实体,它们可以正常工作(因此我知道NpgSqlConnection工作正常)。事实上,我所有的VARCHAR PK实体都失败了,而我所有的自动递增PK实体都成功了
我有很多属性,所以如果可以避免的话,我不想手动写出SQL
如何让SimpleCRUD正确使用VARCHAR/string主键?我认为[Key][Required]标签就可以了。试试[ExplicitKey]。这适用于字符串和int键
ExplicitKey:将属性显式指定为数据库不会自动生成的键
在分析了源代码之后,我得出结论,SimpleCRUD并不真正支持varchar作为主键。Dapper.Contrib.It也不希望它们是整数或长整数。现在是下班时间,但看起来我周一早上的第一件事就是编写定制SQL查询。您使用这种方法成功了吗?实际上我已经试过了,也遇到了类似的问题。insert方法返回int/long(不记得是哪个)。我没有花太长时间玩它,所以我可能错过了一些东西。是的,它很管用。您是否检查了数据库中的插入操作?默认情况下,Insert()返回一个int/long,它应该是生成的id,但由于您有一个显式字符串键,因此该方法返回0。没有问题,因为您已经知道记录的密钥。已测试并正在工作。标记为答案,因为这是一个有用的解决方案,即使它不能真正回答问题。