У меня проблема с тем, что NHibernate не использует мою конфигурацию сопоставлений для быстрой загрузки коллекции, когда я получаю что-то с помощью HQL или Linq (Session.Query). Session.Get и Session.QueryOver работают как ожидалось.
Я использую NHibernate 3.2. Вот отображение коллекции в моем отображении продукта.
<bag name="OrderItems" inverse="true" cascade="none" lazy="false" fetch="join">
<key column="order_id" />
<one-to-many class="OrderItem" />
</bag>
и с другой стороны отображение выглядит так:
<many-to-one name="Product" class="Product" column="product_id" not-null="true" />
У меня 4 теста, 2 успешных и 2 нет. Они используют Session.SessionFactory.Statistics для отслеживания CollectionFetchCount (был выбран OrderItems в 1 объединенном запросе или в отдельном). Намерение состоит в том, чтобы выбрать и загрузить OrderItems при выборе продукта, поскольку к OrderItems также почти всегда осуществляется доступ.
LastCreated - это простая ссылка на последний продукт, вставленный в БД.
[Test] /* Success */
public void Accessing_Collection_Using_Session_Get_Results_In_1_Select()
{
// Get by Id
var product = Session.Get<Product>(LastCreated.Id);
var count = product.OrderItems.Count;
Assert.AreEqual(0,statistics.CollectionFetchCount,"Product collectionfetchcount using Get");
}
[Test] /* Success */
public void Accessing_Collection_Using_Session_QueryOver_Results_In_1_Select()
{
// Get by Id
var product = Session.QueryOver<Product>().SingleOrDefault();
var count = product.OrderItems.Count;
Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using QueryOver");
}
[Test] /* Fail */
public void Accessing_Collection_Using_Session_Query_Results_In_1_Select()
{
// Get by IQueryable and Linq
var product = Session.Query<Product>().Single(x => x.Id == LastCreated.Id);
var count = product.OrderItems.Count;
Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using Linq");
}
[Test] /* Fail */
public void Accessing_Collection_Using_HQL_Results_In_1_Select()
{
// Get by IQueryable and Linq
var product = Session.CreateQuery("from Product where Id = :id")
.SetParameter("id",LastCreated.Id)
.UniqueResult<Product>();
var count = product.OrderItems.Count;
Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using HQL");
}
Это предполагаемое поведение или я что-то не так делаю?