2009-06-12 52 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才能在同一會話中前行,你再提到你可能得到真正的對象不是代理