我目前正在调查使用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/