2017-07-27 28 views
0

我剛剛從Npgsql的V2.2.3升級到使用精緻小巧和SimpleCRUD的系統上v3.2.4.1(現爲V3.2.5)被稱爲 - 其他開發商缺席後者的定製版本。它不是我的領域 - 我只是想用v3支持做一些PostGIS位...Dapper.SqlMapper.AddTypeHandler似乎不是在Postgres SimpleCRUD where子句

我們有一個自定義版本的DateTime,在Npgsql v3.x更嚴格的類型下,要求我們將NpgsqlDbType設置爲NpgsqlTypes.NpgsqlDbType.Timestamp。這是通過SimpleCRUD代碼中的Dapper.SqlMapper.AddTypeHandler完成的。自定義版本強制日期時間種類爲UTC。

雖然這個工程如預期的數據庫插入,它似乎並不時WHERE子句中使用被稱爲 - 不知道,如果它只是在個別情況下,或者只是在一個兩個地方。

我可以從,爲WHERE子句的參數被調整UTC /本地轉換Postgres的日誌中看到:參數:$ 1 = '2017年7月27日13:29:51 + 01'

通過斷點,我還可以看到該類型的處理程序沒有被輸入的WHERE子句,但對於INSERT等

問題:

我應該期待被調用的Dapper.SqlMapper類型處理器WHERE子句參數?

如果它不是預期的行爲,如何在使用Dapper.SimpleCRUD時強制將NpgsqlDbType強制爲NpgsqlTypes.NpgsqlDbType.Timestamp?

非常感謝

我已經更新到Npgsql的(3.2.5)和小巧玲瓏(1.50.2)的最新NuGet包。不確定Dapper.SimpleCRUD的起源,但它將在2014年開始生效,然後纔會被看作是潛在的大量定製,所以寧願繼續這樣做,而不是升級並重新添加定製。

回答

0

託管排序問題。

我添加了一個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; 
    }