Получение нескольких запросов при совершении транзакции, почему? - PullRequest
3 голосов
/ 04 сентября 2010
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 запросов. Кто-нибудь знает, почему это может происходить?

1 Ответ

0 голосов
/ 05 сентября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...