Nhibernate Обновить IEnumerable


У меня есть два класса

public class Notification
{
    public virtual Guid ID { get; set; }
    public virtual IEnumerable<Message> Messages {get;set;}
}

public class Message
{
    public virtual Guid ID { get; set; }
    public virtual string Message { get; set; }
}

У меня их два .элементы управления ascx на моей странице и один вызывает привязку на другом через открытый метод. Теперь, если я добавляю строку в список сообщений, а затем запускаю метод bind, который просто получает уведомление по ID и возвращает сообщения. Я не получаю только что добавленное сообщение. Я должен обновить страницу еще раз, прежде чем она получит эти данные.

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

Я тоже пробовал

Сессия.Выселить
Сессия.Обновить

1 2

1 ответ:

Пожалуйста, проверьте Q и A, опубликованные ниже, я думаю, что их случай очень похож на ваш. Может быть, просто изменив способ, которым вы управляете своими коллекциями

Reload association / related collection в NHibernate
Как лучше всего обновить сущности в nhibernate
https://forum.hibernate.org/viewtopic.php?f=1&t=968923

Основная проблема заключается в том, что NH не имеет понятия "коллекция". Все дело в том, чтобы обрабатывать объекты и сопоставлять их к столам. Если вы следуете за отношением, NH генерирует запрос, загружает список объектов, думает, что это сделано, и радуется этому. Вы получаете коллекцию объектов, возвращенных запросом. Чтобы повторно прочитать коллекцию, вам действительно нужно повторно выполнить запрос. Вот что такое запросы и критерии: подготовить что-то, что можно повторно использовать для обновления коллекций. Освежение-путем повторного извлечения их из БД.

IIRC, NH отслеживает объекты. Это означает, что если первый запуск запрос вернул объекты A, B, C и поместил их в список, затем hext run вернул A,C,D, E и вернул их в какой-то другой список, тогда объекты A и C будут все теми же объектами, что и в первый раз. Клонирования объектов не будет, если вы не используете различные сеансы NH. Конечно, вы должны позаботиться об обоих списках - то есть вы должны решить, как объединить их в одну вещь, показанную пользователю. обычно вы захотите увянуть отбросьте первый и используйте только самый свежий, чтобы немедленно указать, что 'B' удален, или объединить их обоих, делая вид, что 'B' никогда не удалялся и молча исправляя это на фиксации.