2011-08-01 94 views
0

我有這樣的映射:僅獲得一個我多對一對象的ID

[Class(Table = "foo", Name = "Foo")] 
public class Foo 
{ 
    [Id(0, TypeType = typeof(long), Name = "Id", Column = "id")] 
    [Generator(1, Class = "native")] 
    public virtual long Id { get; set; } 

    [ManyToOne(Class = "Bar", Column = "bar_id", NotNull = true)] 
    public virtual Bar Bar { get; set; } 
} 

[Class(Table = "bar", Name = "Bar")] 
public class Bar 
{ 
    [Id(0, TypeType = typeof(long), Name = "Id", Column = "id")] 
    [Generator(1, Class = "native")] 
    public virtual long Id { get; set; } 

    [Bag(0, Inverse = true, Table = "foo", Cascade = "save-update")] 
    [Key(1, Column = "bar_id", ForeignKey = "fk_foo_bar_id")] 
    [OneToMany(2, Class = "Foo")] 
    public virtual IList<Foo> Foos { get; set; } 
} 

,我想這樣做的SQL查詢:

SELECT bar_id FROM foo f WHERE f.id = 1 

我知道我可以做

Session.Get<Foo>(1).Bar.Id然而,它加載了Bar對象,並且如果它是一個非常有用的對象,我的簡單查詢只需要在之內的東西表很慢。我應該怎麼做?

我想增加一個屬性這樣

[Property(Column = "bar_id", NotNull = true)] 
public virtual long BarId { get; set; } 

但我不知道這是否是錯誤的或者不,還是我應該是不同的。

回答

0

最後我們做到了這樣:

public class FooToBarResult 
{ 
    public string FooId { get; set; } 
    public int BarId { get; set; } 
} 

IList<BlockToComponentResult> result = session 
     .CreateSQLQuery(@"SELECT bar_id as BarId, id as FooId FROM `foo`") 
     .SetResultTransformer(Transformers.AliasToBean<FooToBarResult>()) 
     .List<FooToBarResult>(); 

我的結論是,NHibernate的是冷靜,如果你這樣做,他們想要你做的只是什麼,但只要你有一些性能問題,並希望優化該查詢,你需要回到SQL,並開始痛苦。

0

NHibernate支持lazy properties。檢查是否可以解決您的問題。

+0

是的我知道延遲加載,但我無法改變我的第二個酒吧對象。實際上,我只是不明白我的NHibernate迫使我加載對象Bar,對於我的第一個對象Foo裏面的東西... –

+0

它不是懶加載,它是懶惰的屬性...如果你有龐大的字段(而不是映射),你可以標記爲懶惰。去檢查ayende的文章。 – Illuminati

+0

對不起,我知道這篇文章,並在代碼中使用它。我的問題是,我無法更改屬性,使屬性爲惰性,因爲它可能會破壞其他代碼。 –

0

嘗試使用Session.Load<Foo>(id)

NHibernate應該足夠聰明,意識到它不需要加載Bar並生成一個包含其ID的代理版本。如果你訪問了它的另一個屬性,它只會加載Bar。

但是Session.Get()does not do this因爲它使用緩存。但是,如果您要將其更改爲使用Session.Load<Foo>(id),則應該看到此行爲。

+0

您的意思是。負載(id)?因爲在這裏我不知道酒吧的身份證,這是我想要的 –

+0

是的,對不起。編輯。 –

+0

然後,如果我做Session.Load (id).Bar.Id,你認爲它不會加載Bar對象,但只有Bar.Id屬性? –