Граф будущего объекта NHibernate много запросов - PullRequest
7 голосов
/ 25 марта 2011

Учитывая, что многоуровневый граф объектов вызывается с использованием Future как:

var Dads = db.Session.Query<Parent>().Where(P => P.EntityKey == Id)
             .ToFuture<Parent>();
var Kids = db.Session.Query<Kid>().Where(K => K.Parent.EntityKey == Id)
             .ToFuture<Kid>();

, когда я вызываю var Dad = dads.ToList (), я вижу, что пакет проходит через провод и отображается в профилировщике.

Проблема в том, что при перечислении коллекции он все еще отправляет однократные запросы в базу данных

Например.

for each (Kid kid in Dad.Kids) // This seems to hit the database 
{
   Teach(kid);
}

Отправляет запрос SQL и обращается к базе данных, чтобы получить каждого ребенка.Почему граф объектов не заполнен?или это ожидаемое поведение?

1 Ответ

4 голосов
/ 25 марта 2011

Такое поведение следует ожидать. Вы просто говорите NHibernate получить две коллекции из базы данных в пакете, что он и делает, как было сказано. Однако вы не говорите, что они связаны. Запросы NH с Futures не объединяют сущности после их выполнения, если им не сказано сделать это с объединением.

Если вы выполняете отдельные запросы без Futures, вы не ожидаете, что родительский объект внезапно заполнит дочернюю коллекцию. По сути, фьючерсы позволяют вам управлять вещами за один раз. Если запросы имеют общий корень с несколькими дочерними коллекциями (например, чтобы избежать декартового произведения), то NH может «объединить» несколько коллекций в одну сущность.

К сожалению, соединения с NH LINQ Api и методом ToFuture(), похоже, создают проблему в текущей (NH 3.0 или 3.1) реализации. В этом случае вам может потребоваться использовать QueryOver Api.

Что касается примечания, я думаю, что название метода не подходит.

Редактировать: после редактирования вопроса имя метода теперь в порядке.

...