nHibernate:保存前确定属性值

时间:2012-07-10 14:28:53

标签: nhibernate iusertype

我们目前正在评估nHibernate是否支持我们项目的要求。我们与另一个应用程序共享数据库,因此我们在模式更改方面不是完全免费的。 某些列填充了唯一且连续的数字(例如,用于发票)。下一个数字由存储过程确定,该存储过程也实现锁定算法,以确保数字是连续的。 一方面,我们可以在各个表上定义一个触发器,当提供空值或特殊值时,该触发器设置列的值。这将需要更改现有的数据库定义 - 尽管它可能是实现此目的的最可靠方法。 为了避免更改数据库定义,我们试图在nHibernate ORM中解决这个问题。我们首先尝试实现一个用户类型,如果提供了空值,则调用NullSafeSet中的存储过程。不幸的是,当调用NullSafeSet时,尚未设置所提供命令的连接和事务。

我们如何用nHibernate解决这个问题?

提前致谢,

马库斯

1 个答案:

答案 0 :(得分:1)

如果您决定使用触发路线,则需要在generated映射中添加property属性。

  

生成的属性是生成其值的属性   由数据库。通常,NHibernate应用程序需要刷新   包含数据库所属的任何属性的对象   产生价值。但是,将生成的属性标记为生成   应用程序将此责任委托给NHibernate。实质上,   每当NHibernate为实体发出SQL INSERT或UPDATE时   已经定义了生成的属性,它会立即发出一个select   之后检索生成的值。

除此之外,我不太确定你如何从NHibernate发出的INSERT调用存储过程,而不在列上添加触发器或默认约束。


修改

通过界面IEntityPersister看起来NHibernate有class个持久性概念。也许你可以从中解决一些问题。

  

persister属性允许您自定义持久性策略   用于上课。例如,您可以指定自己的子类   NHibernate.Persister.EntityPersister或者你甚至可以提供一个   全新的界面实现   实现持久性的NHibernate.Persister.IClassPersister,   例如,存储过程调用,序列化到平面文件或   LDAP。有关简单示例,请参阅NHibernate.DomainModel.CustomPersister   (对Hashtable的“持久性”)。

你可以从NHibernate的source开始。

如果你能够向数据库添加触发器,那么这可能是最好的,直接的方式,而不需要投入太多时间来与NHibernate的内部结构进行斗争。