2011-02-03 43 views
3

對於我的References屬性之一,我正在使用PropertyRef。與LazyLoad()它仍然會執行選擇並加載User實體,即使我從不「擊中」SalesPerson屬性。流利-Nhibernate參考資料和PropertyRef使用惰載進行選擇

訂單映射

Id(x => x.Id).GeneratedBy.Native(); 
References(x => x.SalesPerson) 
         .LazyLoad() 
         .PropertyRef(x => x.Username) 
         .Column("rsm"); 
Map(x => x.Title); 

Order類

public class Order : BaseEntity 
{ 
    ... 
    public virtual User SalesPerson { get; set; } 
    public virtual string Title { get; set; } 
    ... 
} 

用戶映射

Id(x => x.Id).GeneratedBy.Native(); 
Map(x => x.Username).Column("login"); 

用戶類

public class User : BaseEntity 
{ 
    public virtual string Username { get; set; } 
    ... 
} 

生成的訂單映射

<many-to-one class="Project.User" lazy="proxy" name="SalesPerson" property-ref="Username"> 
     <column name="rsm" /> 
</many-to-one> 

執行代碼

var order = session.Get<Order>(1); 
Console.WriteLine(order.Title); 

反正是有防止選擇要加載的時候,我的用戶實體不使用User實體?

回答

2

擁有財產,裁判確實看到 NHibernate creates proxy via session.Load(), but not via Linq or Criteria API

而不是你問,但也考慮到許多對一個與代理不允許你做類型檢查,如果你的子類的用戶,請參閱 http://ayende.com/Blog/archive/2010/01/28/nhibernate-new-feature-no-proxy-associations.aspx

+0

想想我會改變我的模式使用實際的ID,這整個事情是不值得的麻煩,是不好的做法。感謝您的鏈接。 – mxmissile 2011-02-14 16:23:46

1

我不認爲這是NHibernate中的錯誤。這取決於你的映射。

首先,請記住,參考圖將加入2個映射表之間的鍵(主鍵和外鍵)。要阻止SELECT + 1,只需忽略關鍵點。

References(x => x.SalesPerson) 
        .LazyLoad() 
        .PropertyRef(x => x.Username) 
        WithForeignKeyName("none") //disable key join.