【问题标题】:SetFetchMode call ignored忽略 SetFetchMode 调用
【发布时间】:2011-04-22 19:25:58
【问题描述】:

在以下查询中,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,我可以在那里写任何东西。

【问题讨论】:

  • 在单独的答案中发布您的解决方案并接受它。
  • 不能接受我自己的答案 :)

标签: .net nhibernate criteria fetching-strategy


【解决方案1】:

解决方案不是那么明显。我们变了

.CreateAlias("Companies", "comp")

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

【讨论】:

    【解决方案2】:

    由于您使用的是.CreateAlias("Companies", "comp"),NHibernate 无法预先加载集合,因为您可能对该别名使用了限制。

    我的总体建议是从不在集合上使用急切加载。请改用batch_sizethis trick

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-17
      • 2019-05-01
      • 2012-02-09
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多