Dapper использует сопоставление ZonedDateTime с плагином NodaTime Npgsql

Я пробую новый плагин Nodatime для npgsql, и у меня возникла проблема с сопоставлением результата с ZonedDateTime.

С необработанным npgsql я могу получить значение timestamptz и сопоставить его с Instant или ZonedDateTime.

NpgsqlConnection.GlobalTypeMapper.UseNodatime();
using (var connection = new NpgsqlConnection("connection_string"))
{
    connection.Open();

    var command = new NpgsqlCommand("set time zone 'Europe/Vienna'; select now();", connection);

    var reader = command.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine(reader.GetValue(0));  // by default the npgsql Nodatime plugin maps timestamptz to Instant
        Console.WriteLine(reader.GetFieldValue<ZonedDateTime>(0)); // mapping to ZonedDateTime
    }

}

Теперь я пытаюсь заставить сопоставление ZonedDateTime работать с Dapper:

public class DapperTest 
{
    public ZonedDateTime DapperTime { get; set;}
}
NpgsqlConnection.GlobalTypeMapper.UseNodatime();
using (var connection = new NpgsqlConnection("connection_string"))
{

    connection.Open();

    var d = connection.Query<DapperTest>("set time zone 'Europe/Vienna'; select now() as dappertime;").First();

    Console.WriteLine(d);

}

С этим кодом я получаю исключение:

Ошибка синтаксического анализа столбца 0 (dappertime=2017-10-30T12:08:43Z — объект)

Но когда я изменяю свойство «DapperTime» на Instant, оно работает нормально.

Есть ли способ заставить Dapper использовать сопоставление ZonedDateTime, предоставляемое плагином npgsql Nodatime?


person mibiio    schedule 30.10.2017    source источник


Ответы (1)


Dapper поддерживает концепцию «обработчиков типов» для преобразования в/из типов, которые он не распознает. В этом случае вам необходимо зарегистрировать класс, реализующий SqlMapper.TypeHandler<ZonedDateTime>.

Я уже сделал это для нескольких других типов Noda Time в моей библиотеке Dapper-NodaTime. Извините, что он еще не поддерживает ZonedDateTime. Я рассмотрю возможность его добавления с учетом использования npgsql, которое вы продемонстрировали. (Я также с радостью приму запрос на вытягивание.)

person Matt Johnson-Pint    schedule 30.10.2017
comment
Здорово, что вы уже запустили такой проект. Я попытался реализовать ZonedDateTimeHandler, как и вы, для других типов, но не продвинулся далеко. Вы можете посмотреть его здесь. Я не нашел способа повлиять на отображение типов, которое делает npgsql из SqlMapper по-прежнему возвращает Instant. Еще один способ, который, как я думал, может работать, - это выполнить преобразование Instant -> ZonedDateTime в SqlMapper, но для этого необходим доступ к базовому NpgsqlConnection (connection.Timezone). - person mibiio; 31.10.2017
comment
Да, я потратил на это несколько часов прошлой ночью. Требуется много работы, прежде чем он будет готов для postgres. На данный момент это слишком специфично для SQL Server. Будет делать больше в этой области. Пожалуйста, оставьте вопрос открытым и без ответа здесь, если у кого-то еще есть хорошее представление об этом, прежде чем я заработаю. :) - person Matt Johnson-Pint; 31.10.2017