Dapper 및 Npgsql2를 사용하여 Null 값 배열 속성 삽입 문제

c# dapper npgsql postgresql sql

문제

나는 현재 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();
    }
}

위의 코드는 다음 SQL과 param으로 Dapper.Execute를 호출하는 Dapper.Contrib의 SqlMapperExtensions를 사용합니다.

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[]

명령이 실행될 때 일어나는 일은 드라이버가 insert 문에서 참조되는 매개 변수 @Tags 에 대해 불만하지만 명령의 Parameters 컬렉션에는 나타나지 않는다는 것입니다. Dapper는 단순히 그것을 내 보내지 않습니다. 이것은 배열 유형 속성에서만 발생하는 것 같습니다. 제안?

수락 된 답변

이는 단순히 버그 일뿐입니다. 어레이에 대한 포스트 그레스 (postgres)에 대한 특별한 처리가 있는데, 이는 대퍼 (dpper)가 몇 군데에서 작동하는 방식을 바꿉니다. 그 중 하나 ( PackListParameters )는 null이 아닌 시나리오로만 간주됩니다. 나는 약간의 코드를 옮겼다. github에서 코드를 가져 와서 로컬에서 시험해 볼 수 있다면 매우 고맙겠습니다. 잘하면 지금 작동합니다 (참고 : 아직 업데이트되지 않은 NuGet).



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow