Вызов SetFetchMode проигнорирован

У меня проблема с вызовом 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, я могу там писать что угодно.


person Sly    schedule 08.10.2010    source источник
comment
Опубликуйте свое решение в отдельном ответе и примите его.   -  person Restuta    schedule 09.10.2010
comment
не могу принять свои ответы :)   -  person Sly    schedule 13.10.2010


Ответы (2)


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

.CreateAlias("Companies", "comp")

to

.CreateAlias("Companies", "comp", JoinType.LeftOuterJoin)
person Sly    schedule 13.10.2010

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

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

person Diego Mijelshon    schedule 08.10.2010