我正在开发一个使用NHibernate作为ORM的项目。
可以将相当多的实体作为“只读”加载到会话中,因为它们在检索后不应更新。
我试图以两种不同的方式做到这一点:
var entity = criteria.UniqueResult<MyType>();
_session.SetReadOnly(entity, true);
或:
criteria.SetReadOnly(true);
然而,在两种方式中,我都可以看到该实体存在于ISession的PersistenceContext
中。
这是正常的吗?我希望,因为实体是只读/不可变的,所以它不应该出现在PersistenceContext中。 实体类型是复杂类型;它与其他类型有多种关联。
答案 0 :(得分:1)
nhibernate中的只读功能存在一些限制。该功能的名称让人们期望更难以保证防止对象更改。 如果查看文档(http://nhibernate.info/doc/nh/en/index.html#readonly),可能会有许多异常导致数据库发生意外更改。
来自文档:
当实体为只读时:
在某些方面,NHibernate将只读实体视为与非只读实体相同:
考虑到您的期望,它认为对象总是被添加到持久性上下文中,即使它们是只读加载的。否则,Identity-Map -Pattern将不会成立。在Persistence-Context中,有一个Flag表示实体是只读的。
在上下文中,可以通过打开单个实体条目来检查状态。