代码之家  ›  专栏  ›  技术社区  ›  Sly

忽略setFetchMode调用

  •  3
  • Sly  · 技术社区  · 14 年前

    以下查询中的条件API中的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没有任何例外。

    我还尝试在映射中将lazy设置为false,但它也没有帮助。 不知道怎么修,有人能吗?

    在那之后,NHibernate用实体加载了集合。但是他仍然忽略了setfetchmode,我可以在那里写任何东西。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Sly    14 年前

    .CreateAlias("Companies", "comp")
    

    .CreateAlias("Companies", "comp", JoinType.LeftOuterJoin)
    
        2
  •  0
  •   Diego Mijelshon    14 年前

    .CreateAlias("Companies", "comp")

    batch_size this trick