Какой тип ORM вы используете?Вы упоминаете «репозитории», но означает ли это LinqToSql, Entity Framework, NHibernate или другие?
Похоже, вы получаете сообщение об ошибке, поскольку поле User
не загружается как часть исходного запроса.Вероятно, это сделано для уменьшения размера результирующего набора путем исключения связанных полей из исходного запроса для Orders
.
. Существует несколько вариантов решения этой проблемы:
- Настройте репозиторий (или контекст, в зависимости от ORM), чтобы включить свойство
User
в набор результатов. - Явно загрузите свойство
User
, прежде чем получить к нему доступ.Обратите внимание, что это было бы дополнительным обходом базы данных и не должно выполняться в цикле.
В тех случаях, когда вы знаете, что вам нужна информация User
, было бы разумно убедиться, чточто эти данные возвращены из исходного запроса.Если вы используете LinqToSql, взгляните на тип DataLoadOptions .Вы можете использовать этот тип, чтобы указать, какие отношения вы хотите получить с помощью запроса:
var options = new DataLoadOptions();
options.LoadWith<Orders>(o => o.User);
DataContext context = ...;
context.LoadOptions = options;
var query = from o in context.Orders
select o;
Должны быть аналогичные методы для достижения того же результата независимо от того, какой ORM вы используете.
В NHibernateВы можете сделать следующее:
using (ISession session = SessionFactory.OpenSession())
{
var orders = session.Get<Order>(someId);
NHibernateUtil.Initialize(orders.User);
}
Это приведет только к двум отключениям базы данных (независимо от количества возвращенных заказов).Более подробную информацию об этом можно найти здесь .