我目前正在研究使用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根本无法发射它。这似乎只发生在数组类型属性中。建议?
答案 0 :(得分:1)
这可能只是一个错误;对于数组的postgres有特殊处理,这改变了dapper在一些地方的工作方式;它看起来像其中一个地方(PackListParameters
)只考虑非空方案。我已经移动了一些代码;如果你对pulling the code from github开放并在当地尝试,我会非常感激。希望它现在有效(注意:NuGet尚未更新)。