我目前正在调查使用Dapper的Execute和PostgreSQL 9.3的Npgsql2托管提供程序执行insert的问题。
表结构(简化):

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,它调用Dapper.Execute并使用以下SQL和param:
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[]

执行命令时发生的情况是,驱动程序抱怨insert语句中引用了parameter@Tags,但命令的parameter s集合中不存在。Dapper根本无法发出它。这似乎只发生在数组类型属性上。建议?

最佳答案

这可能只是一个bug;postgres对数组有特殊的处理,这改变了dapper在一些地方的工作方式;看起来其中一个地方(PackListParameters)只考虑了非空的情况。我已经移动了一些代码;如果您对pulling the code from github开放并在本地尝试,我将非常感激。希望它现在可以工作(注意:NuGet还没有更新)。

关于c# - 使用Dapper和Npgsql2插入空值数组属性的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25403308/

10-14 02:06