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