В настоящее время я изучаю проблему с выполнением вставки с помощью Dapper Execute в сочетании с управляемым поставщиком Npgsql2 для PostgreSQL 9.3.
Структура таблицы (упрощенная):
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)
Param:
Id 0 int
Created {14.07.2010 19:15:51} System.DateTime
Title "Foo bar baz" string
Tags null string[]
Что происходит при выполнении команды, так это то, что драйвер жалуется на параметр @Tags, который ссылается в инструкции insert, но не присутствует в команде Parameters collection. Dapper просто не может его испустить. Это похоже только на свойства типа массива. Предложения?
Вероятно, это просто ошибка; существует специальная обработка постгеров для массивов, которая меняет способ работы dapper в нескольких местах; похоже, что одно из этих мест (PackListParameters
) учитывает только ненулевой сценарий. Я переместил какой-то код; если вы готовы вытащить код из github и попробовать его локально, я был бы очень благодарен. Надеюсь, теперь он работает (примечание: NuGet еще не обновлен).