我在以下查询中的Criteria 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,我可以在那里写任何东西。
答案 0 :(得分:3)
解决方案并不那么明显。我们已经改变了
.CreateAlias("Companies", "comp")
到
.CreateAlias("Companies", "comp", JoinType.LeftOuterJoin)
答案 1 :(得分:0)
由于您使用.CreateAlias("Companies", "comp")
,NHibernate无法急切加载集合,因为您可能会对该别名使用限制。
我的总体建议是从不在集合上使用急切加载。请改用batch_size
或this trick。