2010-09-04 2 views
3
public Parent GetByName(string Name) 
{ 
    return _session.CreateCriteria<Parent>() 
     .Add(Restrictions.Eq("Name", Name)) 
     .SetFetchMode("Children", FetchMode.Eager) 
     .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
     .UniqueResult<Parent>(); 
} 

public ParentDetailVM GetMeAParent(string Name) 
{ 
    Parent parent; 
    using (var tx = _session.BeginTransaction()) 
    { 
     //This works well, one single query loading 
     //both parent and children 
     parent = _parentRepository.GetByName(Name); 

     //If I include this as suggested by NHProfiler 
     //it all of the sudden sends a new query for each child 
     //and a query for the grandchildren collection 
     tx.Commit(); 
    } 

    return Mapper.Map<Parent, ParentDetailVM>(parent); 
} 

Я проверил, чтобы ничто в файлах сопоставления не было настроено на загрузку. Я не могу понять, почему он работает, если я отойду от фиксации транзакции, но в противном случае он выдает N более запросов. Кто-нибудь знает, почему это может произойти?Получение нескольких запросов при совершении транзакции, почему?

ответ

0

Если вы проверите _session.IsDirty(), прежде чем совершать транзакцию, моя ставка заключается в том, что она вернется. Когда транзакция зафиксирована, сеанс очищается и по какой-либо причине дочерние объекты загружаются для каскадирования изменения.

Это проблема, известная как «ореолы» или фантомные обновления. Типичным сценарием является то, что столбец базы данных является nullable int, но соответствующее свойство объекта не имеет значения NULL. Когда извлекается запись с нулевым значением, NHibernate устанавливает значение свойства равным 0, и поэтому объект загрязнен.

Самый быстрый способ устранить эту проблему - включить динамическое обновление для объекта с использованием dynamic-update="true" в XML-сопоставлениях, DynamicUpdate(), и использовать профилировщик или вести журнал, чтобы увидеть, какие столбцы обновляются после выбора. Также есть утилита под названием Ghostbuster, которую вы можете включить в модульные тесты.

+0

Это имеет большой смысл, данные довольно грубые. Я посмотрю на это и посмотрю, что я нахожу. –

Смежные вопросы