1

使用我们当前的持久性框架属性,指向它的父实体的子实体总是指向同一个实例。例如,给定以下实体类

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

4 回答 4

2

NHibernate 在单个会话(工作单元)中以这种方式工作。通过使用 NHibernate 二级缓存,有多种方法可以使其在单个会话之外以这种方式工作。一个很好的解释可以在这里找到NHibernate 中的第一和第二级缓存

于 2009-06-12T19:12:33.037 回答
2
object.ReferenceEquals( order,order.Items[ 0 ].Order );

可能并不总是如此,这取决于您如何在 nihibernate 映射中设置多对一,如果您将其设置为惰性(如下所示)

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

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

但是,如果您在上一行中的同一会话中获得初始顺序,那么您可能会得到真实对象而不是代理

于 2009-06-12T19:31:48.530 回答
1

是的。他们引用了同一个实例!LINQ to SQL 和实体框架也是如此。

于 2009-06-12T19:12:52.600 回答
0

是的,NHibernate 在 ISession 中使用身份映射来管理实体引用。其他持久性框架做(或应该做)同样的事情。

于 2009-06-12T19:22:24.043 回答