2010-10-08 45 views
3

我有在標準API調用setFetchMode調用一個問題,下面的查詢:調用setFetchMode呼叫忽略

DetachedCriteria.For<User>() 
       .Add<User>(u => u.Status == UserStatus.Live) 
       .CreateAlias("UniqueId", "uid") 
       .CreateAlias("Companies", "comp") 
       .Add(Restrictions.Disjunction() 
           .Add(Restrictions.Like("uid.Uid", context.Text, MatchMode.Anywhere)) 
           .Add(Restrictions.Like("comp.Name", context.Text, MatchMode.Anywhere))) 
       .SetFetchMode("Companies", FetchMode.Eager)); 

我的課表:

public class User : EntityBase<int> 
{ 
    public virtual UniqueId UniqueId { get; set; } 

    public virtual ISet<Company> Companies { get; set; } 
} 

public class Company : EntityBase<int> 
{ 
    public virtual string Name { get; set; } 
} 

public class UniqueId : EntityBase<int> 
{ 
    public virtual string Uid { get; set; } 
} 

和映射

public sealed class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("users"); 

     Id(x => x.Id).GeneratedBy.Native().Column("id"); 

     References(x => x.UniqueId).Column("int_unique_id_ref"); 

     HasMany(x => x.Companies) 
      .KeyColumn("user_id") 
      .Inverse() 
      .AsSet(); 
    } 
} 

public sealed class CompanyMap : ClassMap<Company> 
{ 
    public CompanyMap() 
    { 
     Table("company"); 

     Id(x => x.Id).GeneratedBy.Native().Column("id"); 

     Map(x => x.Name).Column("name"); 
    } 
} 

public sealed class UniqueIdMap : ClassMap<UniqueId> 
{ 
    public UniqueIdMap() 
    { 
     Table("tbl_trading_partner_unique_id"); 

     Id(x => x.Id).GeneratedBy.Native().Column("int_id"); 

     Map(x => x.Uid).Column("str_unique_id"); 
    } 
} 

但是,讓用戶後列表Nhibernate再次查詢數據庫,以便再次爲每個用戶獲取公司集合。 NHibernate的只是忽略調用setFetchMode的電話,因爲我曾嘗試寫這樣的事情:

.SetFetchMode("NotExistingProp", FetchMode.Eager) 

NHibernate的不thows任何異常。

我也試圖在映射中將Lazy設置爲false,但它也沒有幫助。 不知道如何解決它,可以有人

和之後,Nhibernate加載與實體的集合。但他仍然無視SetFetchMode,我可以在那裏寫任何東西。

+0

發佈單獨回答您的解決方案,並接受它。 – Restuta 2010-10-09 19:56:18

+0

不能接受我自己的答案:) – Sly 2010-10-13 07:11:13

回答

3

解決方案不是那麼明顯。我們已經改變

.CreateAlias("Companies", "comp") 

.CreateAlias("Companies", "comp", JoinType.LeftOuterJoin) 
+0

謝謝,這確實有效。 – 2011-09-14 18:54:20

0

由於您使用的是.CreateAlias("Companies", "comp"),所以NHibernate不能急於加載集合,因爲您可能會對該別名使用限制。

我的整體建議是從來沒有使用集合上的急切負載。改爲使用batch_sizethis trick

+0

那麼爲什麼解決方案在更新的答案中有幫助? – Sly 2010-10-08 15:10:05