Как я могу получить 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.