gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:08:13 25 4
gpt4 key购买 nike

我正在从事一个使用 NHibernate 作为 ORM 的项目。

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

我尝试用两种不同的方式来做到这一点:

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

或:

criteria.SetReadOnly(true);

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

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

最佳答案

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

来自文档:

当一个实体是只读的时候:

  • NHibernate 不会对实体的简单属性或单端关联
  • NHibernate 不会更新简单属性或可更新
    单端关联
  • NHibernate 不会更新只读实体的版本,如果
    只有简单的属性或单端可更新关联是
    改变了

在某些方面,NHibernate 将只读实体与非只读实体一样对待:

  • NHibernate 将操作级联到在实体映射。
  • 如果实体有一个集合,NHibernate 会更新版本弄脏实体的变化;
  • 可以删除只读实体。

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

IdentityMap

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

关于c# - 在 NHibernate 中作为 ReadOnly 获取的实体存在于 PersistenceContext 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30052595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com