2013-01-15 26 views
0

我有兩個簡單的對象A和B.對象A具有參考對象B.NHibernate的 - 從引用列選擇ID沒有加入

public class A 
{ 
    public virtual Guid AId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual B BObject { get; set; } 
} 

public class B 
{ 
    public virtual Guid BId { get; set; } 
    public virtual string Name { get; set; } 
} 

我映射這兩個對象與流利,NHibernate的:

public class AMap : ClassMap<A> 
{ 
    public AMap() 
    { 
     Id(x => x.AId); 
     Map(x => x.Name); 
     References<B>(x => x.BObject); 
    } 
} 

public class BMap : ClassMap<B> 
{ 
    public BMap() 
    { 
     Id(x => x.BId); 
     Map(x => x.Name); 
    } 
} 

創建數據庫後,我得到兩個表。 A的表格有一個額外的列'BObject_id'。

我有一個特殊的情況,我只需要選擇引用的對象B的ID。 我使用LINQ來選擇它。

var test = session.Query<A>().Select(x => x.BObject.BId); 

這產生SQL查詢(我使用MSSQL2012):

select b1_.BId as col_0_0_ from iadb.[A] a0_ left outer join iadb.[B] b1_ on a0_.BObject_id=b1_.BId 

休眠連接第一兩個表,然後選擇B的鍵列

我的問題是:

是否可以只從表A中選擇'BOject_id'列的值?

我想避免在這種特殊情況下的連接,並在其他情況下使用引用的好處。

回答

1

您可以用只讀BId屬性擴展您的C#類A

public class A 
{ 
    public virtual Guid AId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual B BObject { get; set; } 
    public virtual Guid BId { get; set; } // virtual "navigational" property 
} 

地圖作爲只讀。這很重要,因爲它將把目標作爲參考BObject。

public AMap() 
{ 
    Id(x => x.AId); 
    Map(x => x.Name); 
    References<B>(x => x.BObject) 
    .Column("BOject_id"); 
    Map(x => x.BId) 
    .Column("BOject_id") // the same column names 
    .ReadOnly(); 
} 

現在你可以得到它沒有加入:

var test = session.Query<A>().Select(x => x.BId); 
0

什麼版本的NHibernate您使用的是?我無法重現這一點;我對類似關係的查詢選擇外鍵。我正在使用3.3.1。

0

你有沒有嘗試過這樣的:

var test = session.Query<A>().Select(x => x.BObject).Select(x => x.BId); 

NHibernate的應該創建一個沒有在這種情況下,加盟代理爲B,和訪問標識符唯一的創建的代理應該不會觸發DB訪問。