NHibernate中只读实体的背景

时间:2013-12-27 01:26:42

标签: nhibernate readonly

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

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

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

1。不可变类在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. 只读实体不会永久保留 ......
  3. 任何解释都很有帮助,非常感谢。

1 个答案:

答案 0 :(得分:3)

让我们对您的问题做一些澄清:

  

1)不可变类在C#代码中意味着“静态”类?

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

如果是nhibernate,您可以使用不可变标志映射您的实体。如果您然后尝试更新已加载实例的属性,则nh可能会抛出异常。

  

2)出于性能原因使用只读实体?(没有脏检查和保存内存)

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

例如,如果要在应用程序的某个位置显示实体列表,并且您知道在会话中从数据库加载这些实体,则不会修改和保存它们,您可以将它们作为只读加载这将让nh优化它。

  

3)只读实体不会永远存在......

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

所以一般来说,这完全取决于你需要什么。如果您只需要对一个会话中的实体进行只读访问,则可以使用此功能来提高性能。否则,请不要使用它。

希望这能回答你的问题。