使用Dapper和Npgsql2插入空值数组属性的问题

时间:2014-08-20 11:15:25

标签: c# sql postgresql dapper npgsql

我目前正在研究使用Dapper的Execute和PostgreSQL 9.3的Npgsql2托管提供程序执行插入操作的问题。

表格结构(简化):

CREATE TABLE posts
(
  id SERIAL NOT NULL PRIMARY KEY,
  title TEXT NULL,
  tags TEXT[] NULL,
  created timestamp NOT NULL,
);

相关实体(简化):

[Table("posts")]
internal class Post
{
  public int Id { get; set; }
  public string Title { get; set; }
  public string[] Tags { get; set; }
  public DateTime Created { get; set; }
}

违规代码

using (var ts = CreateTransactionScope())
{
    using (var con = ConnectionFactory.GetConnection())
    {
        var post = new Post();
        post.Created = DateTime.UtcNow;
        post.Title = "Foo bar baz";
        con.Insert(post);

        ts.Complete();
    }
}

上面的代码使用了Dapper.Contrib的SqlMapperExtensions,它使用以下SQL和param调用Dapper.Execute:

SQL:

insert into posts (title, tags, created) values (@Title, @Tags, @Created)

帕拉姆:

Id  0  int
Created  {14.07.2010 19:15:51}  System.DateTime
Title  "Foo bar baz"  string
Tags  null  string[]

执行命令时发生的事情是驱动程序抱怨插入语句中引用了参数 @Tags 但命令的参数集合中没有。 Dapper根本无法发射它。这似乎只发生在数组类型属性中。建议?

1 个答案:

答案 0 :(得分:1)

这可能只是一个错误;对于数组的postgres有特殊处理,这改变了dapper在一些地方的工作方式;它看起来像其中一个地方(PackListParameters)只考虑非空方案。我已经移动了一些代码;如果你对pulling the code from github开放并在当地尝试,我会非常感激。希望它现在有效(注意:NuGet尚未更新)。