我在 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;
}
}
任何解释都很有帮助,非常感谢。
答案 0 :(得分:3)
让我们对您的问题做一些澄清:
1)不可变类在C#代码中意味着“静态”类?
不,不可变意味着在创建后无法修改对象。意味着无法更改所有属性值。通常,您必须在代码中自己处理如何以及如何使对象成为不可变的。具有getter和setter属性的普通实体是可变的,因为你可以调用setter ......一种方法是拥有一个只读的后备字段,并且该对象的所有属性都不会暴露一个setter ......
如果是nhibernate,您可以使用不可变标志映射您的实体。如果您然后尝试更新已加载实例的属性,则nh可能会抛出异常。
2)出于性能原因使用只读实体?(没有脏检查和保存内存)
是的,这是一个很好的理由。
例如,如果要在应用程序的某个位置显示实体列表,并且您知道在会话中从数据库加载这些实体,则不会修改和保存它们,您可以将它们作为只读加载这将让nh优化它。
3)只读实体不会永远存在......
不知道这个是什么意思?! 只读实体只是表示数据库中的内容的只读表示形式。 Nh期望实例与数据库表示同步100%。对该实体的任何更改/更新都将使其不是只读的。
所以一般来说,这完全取决于你需要什么。如果您只需要对一个会话中的实体进行只读访问,则可以使用此功能来提高性能。否则,请不要使用它。
希望这能回答你的问题。