Простой вопрос, получение обновленной коллекции объектов nhibernate от родителя - PullRequest
1 голос
/ 26 июня 2011

У меня довольно простой вопрос относительно nHibernate, но я не смог найти ответ в Google.

Допустим, у меня есть сопоставленный объект Member, который содержит внешний ключ 1: n для Mail объектов.Я хотел бы получить текущую коллекцию почтовых отправлений для пользователя, когда он входит в свой почтовый ящик.Если я вызываю memberInstance.Mail (типа IList <\ Mail>), он возвращает коллекцию почты, но не отражает новую почту, которая была добавлена, так как memberInstance сохраняется в кеше при входе в систему и не совершает туда-обратнов базу данных.Если я создаю RetrieveMailForUser метод, передаю ему экземпляр Member, а затем вызываю код, такой как Session.CreateCriteria<Mail>, я получаю текущую почту для любого данного члена и все, но кажется посторонним иметь коллекцию Mail в переменной Member, если я никогдаиспользовать его, а также иметь коллекцию в элементе var, которая не актуальна.Я мог бы обновлять участника каждый раз, когда пользователь проверяет свою входящую почту и сохранять ее в кеше, но это, похоже, требует много времени.Я чувствую, что мне не хватает некоторого основного принципа nHibernate.Пожалуйста помоги.Спасибо!

Код, который вызывает участника:

      public static Member GetLoggedInUser()
        {
             var member = (Member) HttpContext.Current.Session[SESSION_NAME];

            if(member != null && 
!NHibernateSessionManager.IsEntityAttachedToCurrentSession(member))
                NHibernateSessionManager.AttachEntityToSession(member);
            return member;


        }

E

1 Ответ

1 голос
/ 26 июня 2011

из вашего поста я выводю два противоречивых требования:

  1. Требуется объект (член) в кеше, который не должен обновляться в соответствии с тем, что происходит в базе данных.Кэш сам по себе НЕ должен автоматически что-либо перезагружать или пытаться сделать это.

  2. Вы хотите, чтобы сообщения в коллекции Mails объекта Member обновлялись при каждом обращении к нему(и, следовательно, не обращая внимания на то, что было в кэше в момент первого извлечения объекта Member).

Если вы хотите придерживаться первого подхода, вы должны обновлять объект Member в кэше напрямую всякий раз, когда для этого объекта создается новая почта (вызывая member.AddMail (mail) иличто-то вроде того).Я не знаю, возможно ли это, так как вы, очевидно, оставляете Участника в сеансе, и для этого потребуется доступ к объектам Участника другого сеанса.

Если вам также нужен «обновленный» список писем, яПредположим, что нет никакого способа ни перезагружать свой почтовый список явно, перезагружать весь ваш объект, либо просто загружать письма так, как вы предлагали это выше (RetrieveMailForUser).В этом случае вы можете уверенно удалить коллекцию Mails в объекте Member.Вам не нужно отображать коллекции, если они вам не нужны.

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