Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带VARCHAR主键的Dapper/SimpleCRUD插入引发FormatException-“;字符串的格式不正确";_C#_Postgresql_Dapper_Npgsql_Dapper Simplecrud - Fatal编程技术网

C# 带VARCHAR主键的Dapper/SimpleCRUD插入引发FormatException-“;字符串的格式不正确";

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 {

我正在尝试使用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 { 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。没有问题,因为您已经知道记录的密钥。已测试并正在工作。标记为答案,因为这是一个有用的解决方案,即使它不能真正回答问题。