2010-06-08 45 views
1

我有兩個表(tbArea,tbPost)與以下類有關。Nhibernate:阻止它加入到不需要的表

class Area 
{ 
    int ID 
    string Name 
    ... 
} 

class Post 
{ 
    int ID 
    string Title 
    Area Area 
    ... 
} 

這兩個類與Fluent Nhibernate映射。以下是帖子映射。

public class PostMapping : ClassMap<Post> 
{ 
    public PostMapping() 
    { 
     Cache.NonStrictReadWrite(); 

     this.Table("tbPost"); 

     Id(x => x.ID) 
      .Column("PostID") 
      .GeneratedBy 
      .Identity(); 

     References(x => x.Area) 
      .ForeignKey("AreaID") 
      .Column("AreaID"); 
     ... 
    } 
} 

任我上Post表「其中areaID表示= 1(任何areaID表示)」,NHibernate的將加入到區域表執行查詢。

(什麼NHibernate的生成查詢)

SELECT 
    post fields 
, area fields (automatically added) 
FROM tbPost p 
LEFT JOIN tbArea a on 
     p.areaid = a.areaid 
where 
    p.areaid = 1 

我試圖區設置爲LazyLoad,到Fetch.Select,只讀,並在參考其他任何設置,仍然會隨時加入到區域。

我想優化後端數據庫查詢,因爲我不需要加載的區域對象只是過濾我想消除不必要的連接到區域每次我查詢帖子。

我需要更改或映射哪些配置以使區域仍然與我的對象中的帖子相關,但在我過濾AreaID時不會查詢它?

+1

你可以發佈代碼發佈查詢嗎? – 2010-06-08 18:55:07

+0

它可能不是重複的,但它可能會幫助你:http://stackoverflow.com/questions/476405/nhibernate-cant-successfully-set-lazy-loading – 2010-06-08 18:55:00

回答

2

繼續搜索後,我發現問題在於Nhibernate Linq庫而不是我的映射或查詢。我想象爲什麼我無法找到更多關於這個問題的原因是因爲大多數使用ORM的人不會查看生成的查詢。無論如何,這裏是確認我的問題的鏈接。

http://codeofrob.com/archive/2009/10/22/why-linq2nhibernate-isnt-ready-for-production-use.aspx

有兩個解決方案,我想出了。雖然使用CreateCriteria實際上創建了正確的查詢,但它並不適用於我如何實現訪問層。我仍然需要進行基於Expressions<Func<T,bool>>聲明中過去了,語句,我發現兩個可能的解決方案是:

  1. 使用這個庫創建標準進行拉姆達語句。

    http://code.google.com/p/nhlambdaextensions/

    拉姆達擴展並未發揮作用,以及我所希望的,但對於其他人可能工作同樣的問題。

  2. 最後,在我的查詢中使用Linq的最佳解決方案是下載並構建Nhibernate 3的開發版本.NH3中的新Linq提供程序完美工作,查詢看起來和我所期望的一樣。

    http://sourceforge.net/projects/nhibernate/develop

1

什麼是查詢碼?這應該工作。

s.CreateCriteria<Post>() 
    .Add(Restrictions.Eq("Area.ID", 1)) 
    .List<Post>(); 

當使用多對一的id屬性時,不需要創建別名。因爲該值已經在Post表中。如果您嘗試使用其他Area屬性,則需要CreateAlias()。

+0

我不得不使用session.Query()。哪裏(x => x.ID == ID)。原因是我有一箇中間界面,通過Expresssion >來允許過濾。有沒有辦法做一個Expression <> linq where語句與createcriteria,或另一種方式來通過Query()做到這一點? – Aaron 2010-06-08 20:08:34

0

不熟悉NHibernate的,但據我所知它類似於LINQ。

例如,我有2個表:

客戶 訂單

1客戶有0許多訂單。

通過LINQ更新訂單將更新附加的客戶。在我的例子中,它將一個重複的客戶插入表中。

我必須在訂單類中實施Detach()方法。

僞代碼:

public void Detach() 
{ 
    this._ReferenceToCustomer = emptyCustomerReference; 
} 

想法是從訂單分離顧客。這是你以後的樣子嗎?