我剛剛在使用Dapper和SimpleCRUD的系統上從Npgsql v2.2.3升級到v3.2.4.1(現在是V3.2.5) - 其他缺席的開發人員定制了後者的版本。它不是我的領域 - 我只是試圖用v3支持做一些PostGIS位...
我們有一個自定義版本的DateTime,在Npgsql v3.x更嚴格的類型下,要求我們將NpgsqlDbType設置為NpgsqlTypes.NpgsqlDbType.Timestamp。這是通過SimpleCRUD代碼中的Dapper.SqlMapper.AddTypeHandler完成的。自定義版本強制日期時間類型為UTC。
雖然這對於數據庫插入是按預期工作的,但是在使用WHERE子句時似乎不會被調用 - 不確定它是在單獨的情況下,還是只在一個或兩個地方。
我可以從Postgres日誌中看到,WHERE子句的參數正在調整為UTC / Local轉換:參數:$ 1 ='2017-07-27 13:29:51 + 01'
通過斷點,我還可以看到沒有為WHERE子句輸入類型處理程序,但是對於INSERT等。
問題:
我是否應該期望為WHERE子句參數調用Dapper.SqlMapper類型處理程序?
如果它不是預期的行為,當使用Dapper.SimpleCRUD時,如何強制NpgsqlDbType為NpgsqlTypes.NpgsqlDbType.Timestamp?
非常感謝
我已更新到Npgsql(3.2.5)和Dapper(1.50.2)的最新NuGet包。不確定Dapper.SimpleCRUD的起源,但它會在2014年開始生活之前看起來可能已經過大量定制,所以寧願繼續這樣做,而不是升級並重新添加自定義。
管理以排序問題。
我添加了一個SqlMapper.ICustomQueryParameter處理程序(DateTimeUTCParameter),並將其作為ConstructDynamicParameters的一部分從SimpleCRUD調用,而不是直接進行轉換。
最後,一旦我確定需要什麼,這是一個直接的改變。
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;
}