2012-04-16 147 views
0

我有以下的HQL語句:NHibernate的生產代理獲取

select distinct t from TaskEntity as 
inner join fetch t.Case as c 
inner join fetch c.Client as client 
inner join fetch c.Matter as matter 

然而,儘管物質具有FETCH反對它,它仍然返回作爲代理。

我給這家對象映射低於

References(x => x.Matter).Columns(new[] {"c_client","c_matter" }); 

我使用JOIN這個試過,但我的問題,我從1至2列去,所以它不會接受的映射。

有什麼想法?

謝謝,

回答

0

我解決了導致此問題的問題。

它也解析爲複合ID!

項目NHibernate的被警告,我沒有忽略equals和GetHashCode,規避大量的代碼修改,並促進代碼重用我做了一個CompositeBaseEntity類早些時候:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Case.Infrastructure 
{ 
    public class BaseCompositeEntity : BaseEntity 
    { 
     public override int GetHashCode() 
     { 
      return base.GetHashCode(); 
     } 

     public override bool Equals(object obj) 
     { 
      return base.Equals(obj); 
     } 
    } 
} 

這個類,把Nhibernate告訴我要避免的東西放回去!由於有兩個按鍵比較平等的,都必須重寫Equals &的GetHashCode()方法,成爲類似:

public override bool Equals(object obj) 
     { 
      if (obj == null) 
       return false; 
      var t = obj as ClientMatterEntity; 
      if (t == null) 
       return false; 
      if (AccountNumber== t.ClientAcconuntNumber && CaseNumber == t.CaseNumber) 
       return true; 
      return false; 
     } 

這樣,NHibernate的確切地知道比較應該怎麼做,然後知道它是否有該對象位於第一級緩存中(它將像我們指定的那樣獲取)。

更多信息可以在這裏找到: http://nhforge.org/blogs/nhibernate/archive/2010/07/01/nhibernate-and-composite-keys.aspx

0

請注意,您還必須提供正確的GetHashCode的實現。

Your Equals的實現也不是很好。

此外,這兩種方法應返回'靜態'值。我沒有看到你的班級,但應該是這樣的:

public class TaskEntity 
{ 
    public int AccountNumber { get; protected set; } 
    public int CaseNumber { get; protected set; } 
    public Client Client { get; set; } 
    public Matter Matter { get; set; } 

    public TaskEntity(int accountNr, caseNr) 
    { 
     AccountNumber = accountNr; 
     CaseNumber = caseNr; 
    } 

    protected TaskEntity() {} // Needed for NHibernate proxies 
} 

我真的建議你在可能的情況下把你的組件id放在單獨的類中。

此外,請閱讀以下有關重寫的文章。因爲您當前的實現可能有缺陷:http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx尤其要了解有關繼承和基本類型的部分。

+0

說我的平等實施是「不是很好」,一切都很好,但你能提供如何改進它的建議嗎? 我編輯了我的答案,提到GetHashCode() – 2012-04-19 12:18:21