NHibernate中只读实体的背景

NHibernate中只读实体的背景,nhibernate,readonly,Nhibernate,Readonly,我阅读了NHibernate参考文档中的第10章“只读实体”,如下所示: 但不幸的是,我不知道为什么要使用只读实体。我想我需要一些背景来理解它,例如: 一,。不可变类在C#代码中是指“静态”类吗?让我们使用代码来显示它 public class entity { public virtual int Id {get; } public virtual DateTime CreatedTime { get; //how about I

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

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

一,。不可变类在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) 不可变类在C#代码中是指“静态”类吗

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

    对于nhibernate,您可以使用immutable标志映射实体。如果随后尝试更新加载实例的属性,nh可能会引发异常

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

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

    例如,如果您希望在应用程序中的某个位置显示实体列表,并且您知道在会话中从数据库加载这些实体,您将不会修改和保存它们,那么您可以将它们作为只读加载,这将允许nh对其进行优化

    3) 只读实体不会永久保留

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

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


    希望这能回答您的问题。

    在映射到数据库视图的情况下,我使用
    mutable=“false”
    。另外两个问题没有意义。非常感谢!但是有一点您说过“对象在创建后不能修改”,“创建后”意味着持久化,例如session.Save(),对吗?不是在创建实例之后,例如new entity()。不,我的意思是在实例化对象之后。不可变基本上意味着对象实例表示的数据不能修改。。。因此,大多数模型或实体都是可变的。。。因为你改变了它们,在列表中添加了一些东西,什么都没有