在NHibernate中作为ReadOnly获取的实体存在于PersistenceContext中

时间:2015-05-05 12:11:02

标签: c# nhibernate isession

我正在开发一个使用NHibernate作为ORM的项目。

可以将相当多的实体作为“只读”加载到会话中,因为它们在检索后不应更新。

我试图以两种不同的方式做到这一点:

var entity = criteria.UniqueResult<MyType>();
_session.SetReadOnly(entity, true);

或:

criteria.SetReadOnly(true);

然而,在两种方式中,我都可以看到该实体存在于ISession的PersistenceContext中。

这是正常的吗?我希望,因为实体是只读/不可变的,所以它不应该出现在PersistenceContext中。 实体类型是复杂类型;它与其他类型有多种关联。

1 个答案:

答案 0 :(得分:1)

nhibernate中的只读功能存在一些限制。该功能的名称让人们期望更难以保证防止对象更改。 如果查看文档(http://nhibernate.info/doc/nh/en/index.html#readonly),可能会有许多异常导致数据库发生意外更改。

来自文档:

当实体为只读时:

  • NHibernate不会脏 - 检查实体的简单属性或 单端协会
  • NHibernate不会更新简单属性或可更新的 单端协会
  • 如果是,则NHibernate不会更新只读实体的版本 只有简单的属性或单端可更新的关联是
    改变

在某些方面,NHibernate将只读实体视为与非只读实体相同:

  • NHibernate将操作级联到对象中定义的关联 实体映射。
  • 如果实体有一个集合,NHibernate会更新版本 变化会污染实体;
  • 可以删除只读实体。

考虑到您的期望,它认为对象总是被添加到持久性上下文中,即使它们是只读加载的。否则,Identity-Map -Pattern将不会成立。在Persistence-Context中,有一个Flag表示实体是只读的。

IdentityMap

在上下文中,可以通过打开单个实体条目来检查状态。