2017-07-27 7 views
0

DapperとSimpleCRUDを使用するシステムで、Npgsql v2.2.3からv3.2.4.1(現在はV3.2.5)にアップグレードしました。後者のカスタマイズされたバージョン。私のフィールドではありません - 私はちょうどv3のサポートでいくつかのPostGISのビットをしようとしていた...Dapper.SqlMapper.AddTypeHandlerがPostgres SimpleCRUD where節で呼び出されないようです。

Npgsql v3.xより厳しいタイピングでは、NpgsqlDbTypeをNpgsqlTypes.NpgsqlDbType.Timestamp。これは、SimpleCRUDコードのDapper.SqlMapper.AddTypeHandlerを介して行われます。カスタムバージョンでは、日付時刻の種類がUTCになります。

これはデータベースの挿入に対して期待どおりに機能しますが、WHERE句を使用すると呼び出されないように見えます。

Iは、UTC /ローカル変換のために調整されて、WHERE句のパラメータPostgresのログから見ることができます:パラメータ:$ 1 = '2017年7月27日13:29:51 + 01'

ブレークポイントを経由して、私はまた、タイプハンドラがWHERE句のために入力されていないことを見ることができますが、その他INSERTため

質問です:

は、私が呼ばれるようにDapper.SqlMapperタイプハンドラを期待するべきですWHERE句のパラメータ?

動作が期待されていない場合、Dapper.SimpleCRUDを使用する場合、NpgsqlDbTypeをNpgsqlTypes.NpgsqlDbType.Timestampに強制するにはどうすればよいですか?

感謝

私はNpgsqlの(3.2.5)とDapperの(1.50.2)の最新のNuGetパッケージに更新しています。 Dapper.SimpleCRUDの起源については不明ですが、2014年に人生が始まり、カスタマイズされている可能性が高いので、カスタム化をアップグレードして追加するのではなく、これを続けることになります。

答えて

0

Managed to sort問題。

SqlMapper.ICustomQueryParameterハンドラ(DateTimeUTCParameter)を追加し、変換を直接行う代わりに、SimpleCRUDからConstructDynamicParametersの一部としてこのハンドラを呼び出しました。

最終的には、何が必要なのかを特定した後は直進的な変更になりました。

private static DynamicParameters ConstructDynamicParameters(Dictionary<string, object> conditionParameters) 
    { 
     var dynParms = new DynamicParameters(); 
     foreach (var kvp in conditionParameters) 
     { 
      if (kvp.Value is DateTimeUTC) 
       dynParms.Add(string.Format("@{0}", kvp.Key), new DateTimeUTCParameter((DateTimeUTC)kvp.Value)); 
      else 
       dynParms.Add(string.Format("@{0}", kvp.Key), kvp.Value); 
     } 
     return dynParms; 
    } 
関連する問題