Nhibernate 由于计算属性的十进制精度而进行幻像更新

Nhibernate 由于计算属性的十进制精度而进行幻像更新,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,描述了我的问题。我有几个计算过的属性。它们在SQL Server中被键入为十进制(9,2),在我的C#类中被键入为十进制。问题的一个例子是: 对象的属性值为14.9 执行计算并将特性值更改为14.90393 刷新会话时,NHibernate会发出更新,因为该属性是脏的 由于数据库字段是十进制(9,2),所以存储的值不会更改 基本上,每次加载此对象时都会发出幻影更新。我不想截断业务对象中的计算,因为这会将它们紧密地耦合到数据库,并且我不想在其他计算中失去精度。我尝试在映射文件中设置比例和精度或Cu

描述了我的问题。我有几个计算过的属性。它们在SQL Server中被键入为十进制(9,2),在我的C#类中被键入为十进制。问题的一个例子是:

  • 对象的属性值为14.9
  • 执行计算并将特性值更改为14.90393
  • 刷新会话时,NHibernate会发出更新,因为该属性是脏的
  • 由于数据库字段是十进制(9,2),所以存储的值不会更改
  • 基本上,每次加载此对象时都会发出幻影更新。我不想截断业务对象中的计算,因为这会将它们紧密地耦合到数据库,并且我不想在其他计算中失去精度。我尝试在映射文件中设置比例和精度或CustomType(“Decimal(9,2)”),但这似乎只会影响模式生成


    我唯一合理的选择似乎是创建一个IUserType实现来处理这个问题。有更好的解决方案吗?

    映射到一个圆角属性,而不是

    在我看来,这更像是一个域问题,而不是NHibernate问题


    您应该将十进制字段复制到DTO对象以执行所有计算,然后与原始NH域实体一起传递回模型/存储库方法。此时,您可以应用舍入以满足精度等级要求,然后将舍入的数字与原始NH实体进行比较,并根据需要进行更新和保存。

    为什么不调整计算方法以计算与数据库相同的精度?如上所述,我不想将属性与数据库字段耦合,也不想在其他计算中使用该值时丢掉精度。