如何让Dapper将.net日期时间映射到datetime2?

Dir*_*irk 19 c# dapper

非常简单,我正在将我们现有的系统从EF转换为Dapper.由于各种公司原因,我们无法真正更改数据库,某些表具有DateTime2类型的列.Dapper将任何.net DateTime转换为DbType.DateTime.

有人必须先碰到这个并找到一个简单的解决方案吗?

Joh*_*eng 39

现在在类似的问题中有一个更简单的解决方案:

SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTime2);
Run Code Online (Sandbox Code Playgroud)

这必须在之前 应用INSERT.谢谢,@ Igand.

  • 对后代的注意:如果此行似乎没有帮助,请确保在您插入数据之前应用了映射,并且在您尝试选择它们之前仍然保留。很明显,但我花了一个多小时才弄清楚,为什么测试总是失败:) (2认同)

Ran*_*pho 11

Dapper是一个单独的文件,包含在您的代码库中.只需编辑文件:

替换(第300行):

        typeMap[typeof(Guid)] = DbType.Guid;
        typeMap[typeof(DateTime)] = DbType.DateTime;
        typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
        typeMap[typeof(byte[])] = DbType.Binary;
Run Code Online (Sandbox Code Playgroud)

附:

        typeMap[typeof(Guid)] = DbType.Guid;
        typeMap[typeof(DateTime)] = DbType.DateTime2;
        typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
        typeMap[typeof(byte[])] = DbType.Binary;
Run Code Online (Sandbox Code Playgroud)

编辑:
在319行附近,还有一个可以为空的DateTime进一步向下覆盖该映射块:

        typeMap[typeof(DateTime?)] = DbType.DateTime;
        typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
Run Code Online (Sandbox Code Playgroud)

至:

        typeMap[typeof(DateTime?)] = DbType.DateTime2;
        typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
Run Code Online (Sandbox Code Playgroud)

  • 编辑库是一个非常糟糕的主意。它使升级变得更加困难。此外,这不再是事实。它现在是一个二进制文件。 (5认同)
  • 如果有些是DateTime而有些是DateTime2怎么办? (3认同)