C# 如何让Dapper将.net datetime映射到datetime2?

C# 如何让Dapper将.net datetime映射到datetime2?,c#,dapper,C#,Dapper,非常简单,我正在将我们现有的系统从EF转换为Dapper。由于各种公司原因,我们无法真正更改数据库,有些表的列类型为DateTime2。Dapper将任何.net DateTime转换为DbType.DateTime 以前一定有人碰到过这个问题,并找到了一个简单的解决方案?Dapper通常是您在代码库中包含的一个工具。只需编辑文件: 更换(第300行周围): 与: typeMap[typeof(Guid)] = DbType.Guid; typeMap[typeo

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

以前一定有人碰到过这个问题,并找到了一个简单的解决方案?

Dapper通常是您在代码库中包含的一个工具。只需编辑文件:

更换(第300行周围):

与:

        typeMap[typeof(Guid)] = DbType.Guid;
        typeMap[typeof(DateTime)] = DbType.DateTime2;
        typeMap[typeof(DateTimeOffset)] = DbType.DateTimeOffset;
        typeMap[typeof(byte[])] = DbType.Binary;
编辑:
在映射块的后面,第319行附近还有一个可为空的日期时间:

        typeMap[typeof(DateTime?)] = DbType.DateTime;
        typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
致:


现在有一个更简单的解决方案:


这必须在插入之前应用。感谢@Igand.

提供具有时区感知功能的日期和时间数据

SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTimeOffset);
我不知道为什么当我尝试使用Datetime2时,仍然会丢失毫秒数。 此DateTimeOffset类型也是Datetime2


日期值范围为公元1月1日至1999年12月31日。时间值范围为00:00:00至23:59:59.999999,精度为100纳秒。时区值范围为-14:00到+14:00。

如果有些是DateTime,有些是DateTime2怎么办?@MetroSmurf事实上,我认为坚持使用DateTime2是最好的选择。DATETIME2在SQL Server中隐式转换为DATETIME,反之亦然。唯一的问题是时间戳的精度损失,因为.Net DateTime比SQL Server DateTime更精确。这是一个多年前就知道的问题,但是,这就是为什么建议首先使用DATETIME2的原因。我确实尝试过这个。但是,您不能在SQL中的DateTime中插入DateTime2。你会得到一个错误。或者更准确地说,我想如果您将命令参数声明为DateTime2,SQL将不允许您将其插入DateTime(我不确定SQLClient是否阻止它,或者它是否是SQL本身)。哦,我刚刚意识到,当我测试这个时,我测试的日期仍然具有MinValue,这就是SQL不允许它进入DateTime的原因。所以我想我一直在正确的轨道上。编辑图书馆是一个非常糟糕的想法。这使得升级更加困难。而且,这不再是事实。现在它是一个二进制文件。请后代注意:如果这一行似乎没有帮助,请确保在插入数据之前应用了映射,并且在尝试选择数据之前仍然保持映射。这很明显,但我花了一个多小时才弄明白,为什么测试总是失败:)谢谢,@Igand刚刚在答案中添加了它,所以没有人会错过它
        typeMap[typeof(DateTime?)] = DbType.DateTime2;
        typeMap[typeof(DateTimeOffset?)] = DbType.DateTimeOffset;
SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTime2);
SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTimeOffset);