4

我有一个负责某些业务逻辑验证的服务对象。在向存储库发布更新之前,它所做的是检查其工作的实体是否符合某些业务规则。

必须检查的规则之一是,与数据库中的实体相比,实体的Status属性是否没有改变。因为我使用共享相同ISession的存储库,所以当我尝试从数据库中获取实体时,为了获取对象进行比较:

if (fromDbEntity.Status != entity.Status) throw new Exception("Cannot change status...");

我总是会从一级缓存中的DbEntity获取 - 所以我在同一个对象上工作。

有没有办法强制 NHibernate/Repository 从数据库中获取实体,即使它已经在会话范围内?

4

4 回答 4

7

加载entity前从会话中驱逐fromDbEntity

session.Evict(entity);

您可以查看官方文档以获取更多详细信息:管理缓存

缺点是您需要手动调用SaveOrUpdateentity因为现在对象不在会话中。

于 2012-06-13T14:03:03.900 回答
3

正如克劳迪奥建议的那样,您可以从会话中驱逐entity,然后加载您的fromDbEntity,进行比较,然后再次将实体与会话合并。

您可能会做的另一件事是fromDbEntity使用无状态会话加载。

但这真的有必要吗?你不能让你的Status财产只读吗?NHibernate 完全能够使用字段来访问数据。或者你可以让你的属性设置器protected

public virtual Status Status { get; protected set; }

这样用户将无法更改属性值,因此无需检查当前值是否与 db one 不同。

于 2012-06-13T14:21:40.330 回答
1

我有一个类似的问题,我通过在我想一直到数据库的任何呼叫之前清除会话来解决它。

session.Clear();

这有点矫枉过正,但它的工作原理。

于 2012-06-14T07:29:59.230 回答
0

你满足逻辑的方式,听起来好像有一个潜在的错误。一个更好的解决方案是打开动态更新,因此只更新更改的值,然后在保存之前验证没有人更改状态。

于 2012-06-14T15:12:12.970 回答