Вызов SetFetchMode игнорируется - PullRequest
       4

Вызов SetFetchMode игнорируется

3 голосов
/ 08 октября 2010

У меня проблема с вызовом SetFetchMode в Criteria API в следующем запросе:

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 ]

3 голосов
/ 13 октября 2010

Решение не так очевидно.Мы изменили

.CreateAlias("Companies", "comp")

на

.CreateAlias("Companies", "comp", JoinType.LeftOuterJoin)
0 голосов
/ 08 октября 2010

Поскольку вы используете .CreateAlias("Companies", "comp"), NHibernate не может загружать коллекцию с нетерпением, так как вы можете использовать ограничения для этого псевдонима.

Мое общее предложение - никогда использоватьнетерпеливая нагрузка на коллекции.Вместо этого используйте batch_size или этот трюк .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...