代码之家  ›  专栏  ›  技术社区  ›  Oliver Weichhold

使用Dapper和Npgsql2插入空值数组属性时出现问题

  •  1
  • Oliver Weichhold  · 技术社区  · 10 年前

    我目前正在调查使用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和参数调用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[]
    

    执行命令时发生的情况是驱动程序抱怨参数 @标签 在insert语句中引用,但在命令的 参数 收集Dapper根本无法发出它。这似乎只发生在数组类型财产上。建议?

    1 回复  |  直到 10 年前
        1
  •  1
  •   Marc Gravell    10 年前

    这可能只是一个bug;阵列的postgres上有特殊的处理,这在一些地方改变了dapper的工作方式;看起来像是其中一个地方( PackListParameters )仅考虑非空场景。我移动了一些代码;如果你愿意 pulling the code from github 并在当地尝试,我将非常感激。希望它现在可以工作(注意:NuGet尚未更新)。