Извлечение объекта и дочерней коллекции в NHibernate с помощью Linq
-
05-09-2019 - |
Вопрос
У меня проблема с использованием Linq для NHibernate для загрузки объекта и быстрой загрузки дочерней коллекции.Объекты выглядят следующим образом:
public class Order
{
public Guid Id {get; set; }
public IList<OrderLine> OrderLines {get;set;}
}
public class OrderLine
{
public Guid Id {get;set;}
public string Item {get;set;}
}
Я пытаюсь загрузить Заказ с определенным идентификатором и (с нетерпением) все его дочерние строки заказа, используя Linq.Мой запрос выглядит следующим образом:
using (var s = _sessionFactory.OpenSession())
using (var tx = s.BeginTransaction())
{
var order = from o in s.Linq<Order>().Expand("OrderLines")
where o.Id == id
select o;
return order.First();
}
Однако, когда я показываю заказ, OrderLines
свойство содержит только один объект - в базе данных определенно есть 3.Как ни странно, если я сделаю предысторию вокруг order
перед возвратом я получаю все 3 дочерних элемента - но это попадает в базу данных дважды.
Я попытался изменить запрос, чтобы использовать Single()
вместо этого, но это тоже не работает.
Я делаю что-то не так с linq?Или это мое использование Expand
неверно?
Заранее спасибо,
Саймон.
Примечание:Я использую автоматическое сопоставление FluentNHibernate для создания своего NH-сопоставления, и моя база данных - это база данных Sqlite (файл, а не в памяти).
Решение
Похоже, что в этой функции есть ошибка:
FirstOrDefault() прерывает FetchType=join с помощью Linq для NHibernate
Взгляните на сгенерированный запрос к базе данных, если в нем есть предложение TOP 1, это может быть проблемой.
Помните, что Linq для NHibernate все еще далек от готовности к производству, поэтому такого рода ошибки могут возникать.