Nhibernate - не удалось аккуратно инициализировать коллекцию ... ни один сеанс или сеанс не был закрыт - PullRequest
1 голос
/ 22 марта 2011

Я получаю эту ошибку, и мне интересно, есть ли у кого-нибудь идеи, как ее отладить.

Спасибо

Инициализация [GL.Objects.Profile`1 [[GL.Objects.Education.Education, GL.Objects, Версия = 0.1.1.0, Культура = нейтральная, PublicKeyToken= ebf25c7be4be0c91]] # 289289]

- не удалось лениво инициализировать коллекцию ролей:

GL.Objects.Profile`1 [[GL.Objects.Education.Education, GL.Objects,Версия = 0.1.1.0, Культура = нейтральная, PublicKeyToken = ebf25c7be4be0c91]]. Profilables,

ни один сеанс или сеанс не был закрыт "

Запускает сеанс

        var watsonService = new WatsonService();

Этот код сохраняет экземпляры объектов.

   watsonService.SaveEducation(e);
    epf1.Profilables.Add(e);
    watsonService.SaveEducationProfile(epf1);
    epf2 = watsonService.GetEducationProfile(epf1.ID.Value);

Первое утверждение проходит нормально. У epf2 есть идентификатор и создается его экземпляр.

        Assert.AreEqual(epf1.ID, epf2.ID);

Это утверждение не выполняется. Profileables соответствует составной таблице, идентификатор которой вставлен успешно. Но теперь, когда я пытаюсь получить доступ к первому элементу в коллекции, происходит сбой.

        Assert.AreEqual(epf1.Profilables[0].ID, epf2.Profilables[0].ID);

Это реализация метода, которая вызывается getEduметод cationProfile.

public T Get<T>(int id) where T : IDataObject
{
    return (T)_session.Load(typeof(T), id, LockMode.Read);
}

Это определение конструктора в файле Fluent Mapping.

public EducationProfileMap()
    {
        Table("Profile");
        Id(x => x.ID)
        .Column("ProfileID")
        .GeneratedBy
        .HiLo(FluentConst.HILO_TABLE,
              FluentConst.NEXTHI_COLUMN,
              FluentConst.MAXLO, 
              String.Format(FluentConst.WHERE_FMT_STR, "Profile"));

        Map(x => x.Type).CustomType<int>().Column("ProfileType");

        HasManyToMany(x => x.Profilables)
                    .ParentKeyColumn("ProfileID")
                    .ChildKeyColumn("EducationID")
                    .Cascade.All()
                    .Table("EducationProfile");
    }

1 Ответ

1 голос
/ 24 марта 2011

Приношу свои извинения за то, что не предоставил более актуальной информации по проблеме. Проблема возникает из-за того, как управляются сеансы.

Мой тест - создание экземпляра следующего класса:

    public WatsonAdaptor(string user)
    {
        if (DataSession == null)
         DataSession = new  HibernateSession(
                       HibernateFactoryManager.HibernateFactory.Watson, user);
    }

Следующий метод вызывается методом SaveEducation

   public int? SaveEducation(Education e) {
        try
        {
            var watson = new WatsonAdaptor("ealite");
            watson.Save(e);
            return e.ID;
        }
        catch (Exception ex)

Который открывает сессию.

По возвращении сессия отбрасывается, поэтому отложенная загрузка невозможна.

Что мне нужно сделать, так это убедиться, что отложенная загрузка происходит, пока сеанс еще открыт.

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