2017-10-30 9 views
2

私はnpgsql用の新しいNodatimeプラグインを試しており、その結果をZonedDateTimeにマッピングする際に問題があります。Dapper使用NodaTime NpgsqlプラグインのZonedDateTimeマッピング

raw 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 "即時にプロパティが正常に動作しています。

Dapperにnpgsql Nodatimeプラグインが提供するZonedDateTimeマッピングを使用する方法はありますか?

答えて

3

Dapperは、認識できない型に変換する「型ハンドラ」という概念をサポートしています。この場合、SqlMapper.TypeHandler<ZonedDateTime>を実装するクラスを登録する必要があります。

私は既にDapper-NodaTimeライブラリの他のいくつかの野田時間タイプに対してこれを行っています。申し訳ありませんが、まだZonedDateTimeをサポートしていません。あなたが実証したnpgsqlの使い方を見て、それを追加します。 (私は喜んでプルリクエストを受け入れます)

+0

あなたはすでにこのようなプロジェクトを始めたことは素晴らしいことです。他のタイプのようにZonedDateTimeHandlerを実装しようとしましたが、遠くには届きませんでした。あなたはそれを見ることができます。(https://gist.github.com/mibiio/1b4af21987695312d973d97c0b79701b)NpgsqlがSqlMapperからタイプインパクトに影響を与える方法を見つけられませんでした。まだInstantを返します。私が動作すると思ったもう一つの方法は、SqlMapperでInstant - > ZonedDateTime変換を行うことですが、基盤となるNpgsqlConnectionへのアクセスが必要です(connection.Timezone)。 – mibiio

+1

ええ、私は昨晩それを数時間過ごしました。ポストグルの準備が整う前に、たくさんの作業が必要です。現時点ではSQL Server固有のものでもあります。この分野でもっとやります。私がそれを働かせる前に他の誰かがこれについて良いアイデアを持っている場合に備えて、質問を開いたままにしておきなさい。 :) –

関連する問題