Есть ли возможность получения данных из бд вместе с навигационными свойствами в devexpress?
получить данные вместе с навигационными свойствами типа коллекция в переменную из БД, отключив сессию UnitOfWork, только после этого обработать данные в параллельном цикле. После получения и удаления сессии данные пропадают из навигационных свойств экземпляра данных. Есть ли возможность оставить данные в навигационных свойствах?
Как я понял навигационны свойства типа коллекция загружаются при первом обращении, т.е работает ленивая загрузка, возможно ли отключить ленивую загрузку или как то не явно обратится к коллекциями экземпляра класса чтобы они подгрузились?
Ответы (1 шт):
DevExpress XPO поддерживает концепцию ленивой загрузки (lazy loading) для навигационных свойств и "тяжелых" данных (например, изображения или документы). Это означает, что связанные коллекции или свойства загружаются только при первом обращении к ним.
Иногда может потребоваться заранее подгрузить эти свойства. Метод Session.PreFetch позволяет явно загрузить свойства-коллекции для списка объектов:
XPCollection<Person> people = new XPCollection<Person>(session);
session.PreFetch(session.GetClassInfo<Person>(), people, nameof(Person.PhoneNumbers));
В данном примере коллекция PhoneNumbers
для всех объектов Person
будет загружена сразу, а не при обращении к ней.
Важно: персистные объекты ХРО не предназначены для работы с отключенной (что бы это ни значило) сессией (UnitOfWork
или Session
). В вашем случае лучше использовать другой подход.
Для безопасного доступа к данным без зависимости от сессии лучше всего скопировать их в другой объект (ViewModel, DTO и тому подобное). Можно скомбинировать этот подход с тем что я показал выше, или использовать XPQuery, который позволит описать необходимый вам запрос к базе данных с помощью LINQ, и с помощью методов Select
и ToArray
материализовать данные в обычные объекты или модели, не требующие связи с сессией.