gpt4 book ai didi

unit-testing - Fluent NHibernate CheckProperty and Dates

转载 作者:行者123 更新时间:2023-12-04 18:53:40 25 4
gpt4 key购买 nike

我设置了一个 NUnit 测试:

new PersistenceSpecification<MyTable>(_session)
.CheckProperty(c => c.ActionDate, DateTime.Now);

当我通过 NUnit 运行测试时,出现以下错误:
SomeNamespace.MapTest: 
System.ApplicationException : Expected '2/23/2010 11:08:38 AM' but got
'2/23/2010 11:08:38 AM' for Property 'ActionDate'

ActionDate 字段是 SQL 2008 数据库中的日期时间字段。我使用自动映射并将 ActionDate 声明为 C# 中的 DateTime 属性。

如果我将测试更改为使用 DateTime.Today,则测试通过。

我的问题是为什么 DateTime.Now 测试失败?将日期保存到数据库时,NHibernate 是否会丢失一些精度,如果是这样,如何防止丢失?谢谢你。

最佳答案

由于 sql server 无法存储所有毫秒(但四舍五入为 .003/.004/.007 秒的增量,如您在 msdn 看到的那样),您应该在将其传递给 CheckProperty 方法之前截断 C# 中的 DateTime 值,因为由于精度损失,从数据库中检索到的 DateTime 与您的 DateTime.Now 不同。

例如,如果您只需要秒的精度,您可以截断毫秒,如 SO 问题的答案所示:How to truncate milliseconds off of a .NET DateTime .
如果您需要更高的精度,您应该使用 timestamp映射类型。

您可以使用扩展方法轻松截断毫秒:

public static class DateTimeExtension
{
public static DateTime TruncateToSeconds(this DateTime source)
{
return new DateTime(source.Ticks - (source.Ticks%TimeSpan.TicksPerSecond), source.Kind);
}
}
//<...>
new PersistenceSpecification<MyTable>(_session)
.CheckProperty(c => c.ActionDate, DateTime.Now.TruncateToSeconds());

关于unit-testing - Fluent NHibernate CheckProperty and Dates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2320743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com