【问题标题】:Background for read-only entity in NHibernateNHibernate 中只读实体的背景
【发布时间】:2015-03-17 04:46:29
【问题描述】:

我在 NHibernate 参考文档中阅读了第 10 章“只读实体”,如下所示:

http://nhibernate.info/doc/nh/en/index.html#readonly

但不幸的是,我不知道为什么要使用只读实体。我想我需要一些背景知识来理解它,例如:

1. immutable classes 是指 C# 代码中的“静态”类?让我们用代码来显示它

public class entity
{
    public virtual int Id {get; }
    public virtual DateTime CreatedTime 
    {
        get; 
        //how about I add this becasue it should be set before session.Save()
        private set; 
    }

}
  1. 出于性能原因使用只读实体?(无脏检查并保存内存)
  2. 只读实体不会永久保留 ......

任何解释都有帮助,非常感谢。

【问题讨论】:

  • 我在映射到数据库视图的情况下使用mutable="false"。其他两个问题真的没有意义。

标签: nhibernate readonly


【解决方案1】:

让我们澄清一下您的问题:

1) 不可变类是指 C# 代码中的“静态”类?

不,不可变意味着对象在创建后无法修改。意味着所有属性值都不能更改。通常,如果以及如何使对象不可变,您必须自己在代码中注意这一点。具有 getter 和 setter 属性的普通实体是可变的,因为您可以调用 setter...一种方法是拥有一个只读的支持字段,并且对象的所有属性都不会暴露 setter...

在 nhibernate 的情况下,您可以使用不可变标志映射您的实体。如果您随后尝试更新已加载实例的属性,nh 可能会引发异常。

2) 出于性能原因使用只读实体?(不进行脏检查并节省内存)

是的,这是一个很好的理由。

例如,如果您想在应用程序的某处显示实体列表,并且您知道在会话中从数据库加载这些实体,您不会修改和保存它们,您可以将它们加载为只读这将使 nh 对其进行优化。

3) 只读实体不会永远持久化......

不知道这个是什么意思?! 只读实体仅表示您在数据库中拥有的内容的只读表示。 Nh 期望实例与数据库表示 100% 同步。对该实体的任何更改/更新都会使其不是只读的。

所以总的来说,这取决于您的需求。如果您只需要在一个会话中对实体进行只读访问,则可以使用此功能来提高性能。否则,请勿使用。

希望这能回答您的问题。

【讨论】:

  • 非常感谢!但是有一点你说“对象在创建后不能修改”,“创建后”意味着持久化,例如session.Save(),对吧?不是在创建实例之后,例如新实体()。
  • 不,我的意思是在您实例化对象之后。不可变基本上意味着对象实例所代表的数据不能被修改......大多数模型或实体都是可变的......因为你改变它们,添加一些东西到列表中而不是
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2011-07-04
相关资源
最近更新 更多