.net 持久性框架中的引用标识
对于指向其父实体的子实体,我们当前的持久性框架属性始终指向同一实例。例如,给定以下实体类.net 持久性框架中的引用标识,.net,nhibernate,persistence,entity,.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;} } 现在,这是我的问题的关键,对于我们当前的框架,以下是正确的 o
public class Order
{
public int OrderId{get;set;}
public EntityCollection<LineItem> Items{get;}
}
public class LineItem
{
public Order Order{ get;set;}
}
现在,这是我的问题的关键,对于我们当前的框架,以下是正确的
object.ReferenceEquals( order, order.Items[ 0 ].Order );
也就是说,当通过Items属性访问时,行项目上的Order属性指向内存中Order对象的完全相同的实例
我有点厌倦了维护我们的实体工具,希望切换到NHibernate或其他持久性框架。那么我的问题是,NHibernate的延迟加载功能是以相同的方式工作,还是会为每个行项目加载Order对象的新实例?NHibernate在单个会话(工作单元)中以这种方式工作。通过使用NHibernate二级缓存,有多种方法可以使它在单个会话之外以这种方式工作。关于这一点,可以在这里找到一个很好的解释NHibernate在单个会话(工作单元)中以这种方式工作。通过使用NHibernate二级缓存,有多种方法可以使它在单个会话之外以这种方式工作。这里有一个很好的解释是的。它们引用同一个实例!LINQ到SQL和实体框架也是如此。是。它们引用同一个实例!LINQ to SQL和实体框架也是如此。是的,NHibernate使用ISession来管理实体引用。其他Persience框架也这样做(或应该这样做)。是的,NHibernate使用ISession来管理实体引用。其他persistence框架也这样做(或者应该这样做) 可能并不总是正确的,这取决于您如何在nihibernate映射中设置多对一,如果您将其设置为懒惰(如下所示)
那么reference equals将不会返回true
但是,如果您在前面一行中的同一会话中获得初始顺序,则可能会获得真正的对象而不是代理
可能并不总是正确的,这取决于您如何在nihibernate映射中设置多对一,如果您将其设置为懒惰(如下所示)
那么reference equals将不会返回true
但是,如果您在前面一行中的同一会话中获得初始顺序,则可能会获得真正的对象而不是代理
object.ReferenceEquals( order, order.Items[ 0 ].Order );
object.ReferenceEquals( order,order.Items[ 0 ].Order );
<many-to-one name="order" lazy="proxy" />