1

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

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

提前致谢,

马库斯

4

1 回答 1

1

如果您决定使用触发路由,那么您需要将生成的属性添加到您的属性映射中。

生成的属性是其值由数据库生成的属性。通常,NHibernate 应用程序需要刷新包含数据库为其生成值的任何属性的对象。然而,将属性标记为已生成,可以让应用程序将此责任委托给 NHibernate。本质上,每当 NHibernate 为已定义生成属性的实体发出 SQL INSERT 或 UPDATE 时,它会立即发出 select 以检索生成的值。

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


编辑

看起来 NHibernate 通过 interface 有一个持久化的概念IEntityPersister。也许你可以从中破解一些东西。

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

您可以从 NHibernate 的源代码开始。

如果您有能力向数据库添加触发器,那可能是最好的、直接的方法,而无需花费太多时间与 NHibernate 的内部进行斗争。

于 2012-07-10T14:47:02.157 回答