2009-12-23 2 views
0

У меня есть объект, который имеет много связей с другими объектами. Все они лениво выводятся nHibernate, что хорошо практически во всех случаях.Как установить Fetchmode во всех связях nHibernate ICriteria за один раз?

В конкретном сценарии, в данном случае экспорте большого количества записей, я хочу настроить Fetchmode на все ассоциации. Есть ли способ сделать это без необходимости вручную указать каждый из них:

ICriteria crit = CreateCriteria(). 
    .SetFetchMode("Address", FetchMode.Eager) 
    .SetFetchMode("ContactPerson", FetchMode.Eager); 

Метод, который я хотел бы найти, но не смог:

// This doesn't work. 
ICriteria crit = CreateCriteria().SetFetchMode(FetchMode.Eager); 

ответ

1

Нет, есть нет способа сделать это одеялом.

+0

Это мой страх ... Надеюсь, кто-то докажет, что я неправ. –

+0

Увы ... tis на самом деле. Я использовал другой подход, выбирая записи один за другим и добавляя к экспорту, смешивая сеанс между ними. Теперь у сервера больше не хватает памяти. Это, по крайней мере, быстрое исправление, которое мы внедрили для выхода: P –

2

Вы можете попробовать использовать метаданные NHibernate.

ISessionFactory sessionFactory; 

Type type = typeof(MyEntity); 
IClassMetadata meta = sessionFactory.GetClassMetadata(type); 
foreach (string mappedPropertyName in meta.PropertyNames) 
{ 
    IType propertyType = meta.GetPropertyType(mappedPropertyName); 
    if (propertyType.IsAssociationType) 
    { 
     // initialize property 
     // recursively go through the properties of the associated entity 
    } 

    if (propertyType.IsCollectionType) 
    { 
     // initialize collection 
     // if it is a collection of entities, 
     // recursively go through the properties of the associated entity 

     // Use NHibernateUtil.Initialize 
    } 
} 

Я не уверен, что это стоит усилий.

+0

Спасибо. Я выполняю операцию на том уровне, на котором у меня нет доступа к сессии, поэтому я сомневаюсь, что эта оценка принесет мне пользу. Но я посмотрю на MetaData! –

+0

Вы можете реализовать весь этот материал, где знаете фабрику сеансов, и предоставить его интерфейсом для другой части. –