Есть ли возможность получения данных из бд вместе с навигационными свойствами в devexpress?

получить данные вместе с навигационными свойствами типа коллекция в переменную из БД, отключив сессию UnitOfWork, только после этого обработать данные в параллельном цикле. После получения и удаления сессии данные пропадают из навигационных свойств экземпляра данных. Есть ли возможность оставить данные в навигационных свойствах?

Как я понял навигационны свойства типа коллекция загружаются при первом обращении, т.е работает ленивая загрузка, возможно ли отключить ленивую загрузку или как то не явно обратится к коллекциями экземпляра класса чтобы они подгрузились?


Ответы (1 шт):

Автор решения: Uranus

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 материализовать данные в обычные объекты или модели, не требующие связи с сессией.

→ Ссылка