3

次のクエリで 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 を無視しています。私はそこに何でも書き込むことができます。

4

2 に答える 2

3

解決策はそれほど明白ではありません。変更しました

.CreateAlias("Companies", "comp")

.CreateAlias("Companies", "comp", JoinType.LeftOuterJoin)
于 2010-10-13T07:13:23.317 に答える
0

を使用.CreateAlias("Companies", "comp")しているため、そのエイリアスに制限を使用している可能性があるため、NHibernate はコレクションを熱心にロードできません。

私の全体的な提案は、コレクションで熱心なロードを使用しないことです。batch_sizeまたはこのトリックを代わりに使用してください。

于 2010-10-08T14:04:21.853 に答える