Как я могу получить Dapper для отображения .net datetime в datetime2?
Довольно просто, я конвертирую нашу существующую систему из EF в Dapper. По различным корпоративным причинам мы не можем реально изменить базу данных, некоторые из таблиц имеют столбцы типа DateTime2. Dapper преобразует любой .net DateTime в DbType.DateTime.
Кто-то, должно быть, столкнулся с этим раньше и нашел легкое решение?
Ответы
Ответ 1
Dapper является laterally единственным файлом, который вы включаете в свою базу кода. Просто отредактируйте файл:
Заменить (около строки 300):
typeMap[typeof(Guid)] = DbType.Guid;
typeMap[typeof(DateTime)] = DbType.DateTime;
typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
typeMap[typeof(byte[])] = DbType.Binary;
С помощью:
typeMap[typeof(Guid)] = DbType.Guid;
typeMap[typeof(DateTime)] = DbType.DateTime2;
typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
typeMap[typeof(byte[])] = DbType.Binary;
Edit:
Там также нулевая DateTime далее вниз, что блок отображений, вокруг строки 319:
typeMap[typeof(DateTime?)] = DbType.DateTime;
typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
To:
typeMap[typeof(DateTime?)] = DbType.DateTime2;
typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
Ответ 2
В гораздо более удобном решении аналогичный вопрос:
SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTime2);
Это должно быть применено до INSERT
. Спасибо, @Igand.
Ответ 3
Для даты и времени данных с учетом часового пояса.
SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTimeOffset);
Я не знаю, почему, когда я пытался использовать Datetime2, я продолжал терять миллисекунды. Этот тип DateTimeOffset также является Datetime2.
Диапазон значений дат - с 1 января 2009 года по 31 декабря 9999 года нашей эры. Диапазон значений времени - от 00:00:00 до 23: 59: 59.9999999 с точностью до 100 наносекунд. Диапазон значений часового пояса составляет от -14: 00 до +14: 00.