持久性框架中的引用标识

时间:2009-06-12 19:08:08

标签: .net nhibernate persistence entity

我们当前的子实体上的持久性框架属性指向它的父级始终指向同一个实例。例如,给定以下实体类

public class Order
{
    public int OrderId{get;set;}
    public EntityCollection<LineItem> Items{get;}
}

public class LineItem
{
    public Order Order{ get;set;}
}

我们可以从数据库加载订单,如下所示:

var order = Order.FindById( 1000 );

现在,这是我的问题的关键,以下对我们当前的框架来说是正确的

object.ReferenceEquals( order, order.Items[ 0 ].Order );

也就是说,当通过Items属性访问时,行项目上的Order属性指向内存中订单对象的完全相同的实例。

我已经厌倦了维护我们的实体工具,并希望切换到NHibernate或其他持久性框架。我的问题是,NHibernate的延迟加载功能是否以相同的方式工作,还是会为每个行项加载Order对象的新实例?

4 个答案:

答案 0 :(得分:2)

NHibernate在单个会话(工作单元)中以这种方式工作。通过使用NHibernate二级缓存,可以通过这种方式使其在单个会话之外工作。可以在First And Second Level Caching In NHibernate

找到对此的一个很好的解释

答案 1 :(得分:2)

object.ReferenceEquals( order,order.Items[ 0 ].Order );

可能并非总是如此,这取决于你如何在nihibernate映射中设置多对一方面,如果你把它设置为懒惰(如下)

<many-to-one name="order"  lazy="proxy" />

然后引用等于不会返回true。

但如果您在上一行的同一会话中获得了初始订单,则可能获取真实对象而不是代理

答案 2 :(得分:1)

是。他们引用相同的实例! LINQ to SQL和Entity Framework也是如此。

答案 3 :(得分:0)

是的,NHibernate在ISession中使用Identity Map来管理实体引用。其他持久性框架确实(或应该)相同。