2009-08-17 75 views
0

我使用NHibernate作为我的ORM。我有一种情况,我在ITransaction中包装了一些东西。我正在监听NHibernate中的SaveUpdate事件,然后在SaveUpdate处理程序中进行实体验证。NHibernate - 验证和交易的问题

对于我的一个实体,我想验证某个属性的值没有改变。所以我想,我会加载数据库中现有对象的值,并将其与新值进行比较。问题是我调用了ITransaction.Commit()来保存我的实体对象,并且事务在验证发生时并未实际提交,所以我无法从数据库加载现有对象,因为事务已将其锁定。

所以我想我在这里有几个不同的问题: - SaveUpdate事件是否是验证的正确位置? - 有没有另外一种方法可以做到这一点,以便我可以做我需要做的验证(从数据库中获取现有值并进行比较)?

我确定有人在那里遇到类似的情况......希望!

回答

0

如果您想查看如何进行验证的示例,我建议您查看ScottGu的NerdDinner。尽管他使用Linq to SQL来实现他的ORM,但是很容易将其适用于NHibernate。

我最近在ASP.NET MVC + NHibernate项目中使用了类似于NerdDinner的验证系统,并取得了巨大成功。

0

验证与持久性无关,所以saveupdate不是正确的地方。验证的正确位置取决于:要验证的内容,编程风格,用于显示验证消息的UI框架等。就个人而言,我更愿意将验证放在事物发生变化的地方,所以我会把它放在设置属性的更改方法中。我不明白你为什么要加载前一个状态的实体,因为这个状态在第一次加载时已经加载。

+0

我不同意。我最终希望在保存之前验证我的实体,所以我认为它确实与持久性有关。对属性进行验证适用于简单情况,但有时验证规则不仅仅涉及单个实体(例如,银行帐户只能拥有一个主要帐户持有者)。 – 2009-08-18 13:02:07

+0

这不是不使用方法来更改实体中的事物的原因。聚合根应该负责验证它的子实体。 – Paco 2009-08-18 13:55:27

+0

但是当我保存一个聚合根的子实体时呢? – 2009-08-18 14:08:22