2009-06-12 50 views
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属性访问时,订单项上的订单属性指向内存中订单对象的完全相同的实例。

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

回答

2

NHibernate在单个会话(Unit Of Work)中以这种方式工作。有很多方法可以通过使用NHibernate二级缓存使它在单个会话之外以这种方式工作。对此的一个很好的解释可以在这里找到First And Second Level Caching In NHibernate

1

是的。他们引用同一个实例! LINQ to SQL和Entity Framework也一样。

0

是的,NHibernate在ISession中使用Identity Map来管理实体引用。其他的职业框架确实(或应该)也一样。

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

可能并不总是如此,这取决于你如何设置在nihibernate映射多到一边,如果你将其设置为懒惰(如下图所示)

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

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

但是,如果你得到的INTIAL才能在同一会话中前行,你再提到你可能得到真正的对象不是代理