我在将 DateTime 保存到 SQL Lite 数据库时遇到问题。(也许也适用于 MS SQL)
我想用 NHibernate 将 UTC 时间的 DateTime 保存到数据库并从数据库中加载它。我们使用UTC时间在hole应用程序中工作,当我们在ui上显示时间时,我们将其更改为当地时间。
我阅读了很多关于 DateTime 和 NHibernate 的内容:
但没有任何作用。一些例子:
PreUpdate:在保存实体之前。
Saved : 是用 nhibernate (repo.save(o);) 保存后保存的对象。
Loaded:当我通过 id 从存储库加载实体时。
// The next 3 examples are with:
o.Created = DateTime.UtcNow;
Run Code Online (Sandbox Code Playgroud)
CustomType<TimestampType>()UtcTime: 16:44... LocalTime: 18:44
这里的问题是,当我通过 id 重新加载对象时,新对象的时间是 18...(+2h)而不是 16.... 并且 DateTime 类型是未指定的。
CustomType<DateTimeType>() …我有一个关于 NHibernate 代理的问题。我的日志文件中有很多日志,例如:将代理缩小到 - 此操作中断==网上还有一些其他问题和不同的答案:
Stackoverflow NHibernate 缩小代理警告 这是否是一件大事取决于您愿意接受的风险程度。由于代码和数据库之间始终存在脱节,因此您无法始终确保转换能够正常工作。这将导致可能难以诊断的错误,并且如果不更改数据库或代码就可能无法解决。
hibernate 的另一篇文章:
缩小问题范围 不要担心他的警告,只需将以下内容放入您的日志文件中,您就不会再看到它了......
为什么会发生这种情况?假设您有一个与地址具有多对一关联的产品。两者都是实体,并且 Address 有一个 ShippingAddress 子类。
让我们从数据库中 Session.get(..) 获取一个以 ShippingAddress 作为关联的产品。因为多对一是惰性的,所以它会返回一个Address代理。请注意,这是一个地址代理,而不是一个 ShippingAddress 代理,因为代理将始终与产品中提到的类型匹配(有关详细信息,请参阅 hibernate 书籍)。
该代理由 Hibernate 存储在其代理缓存中。现在,我们从数据库中 Session.get(...) 获取相同的 ShippingAddress,该地址与我们使用的从数据库中获取的产品相关联。现在 Hibernate 将发现它已经包含此 ShippingAddress 的代理并将返回它。但是,它会注意到类型不相同,因此必须进行“向下转型”。因为后一个操作对于“代理”来说是不可能的,所以它将创建新的操作并返回它......
正如你所看到的,没什么好担心的。 您可以考虑将地址设置为值类型...在我的情况下,这是没有选择的。
还有最后一张
以下是 NHibernate 的代码:StatefulPersistenceContext.cs -> NarrowProxy(..)
那么,到底有没有问题呢?我总是在程序中使用分离的对象。我希望有一个人可以帮助我。多谢。