Проблема с версионностью Nhibernate - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть метод, который возвращает список предлагаемых заказов. Если пользователь передает нулевое значение, этот критерий игнорируется.

public IList<SuggestedOrderItem> GetSuggestedOrderItemByCriteria
        (
            int? itemNumber,
            int? deptNumber            
        )
    {
        try
        {
            NHibernate.ICriteria criteria = NHibernateSession.CreateCriteria(typeof(Core.SuggestedOrderItem));

            if (itemNumber.HasValue)
                criteria.CreateCriteria("Item", "Item").Add(Expression.Eq("Item.ItemNumber", itemNumber.Value));

            if (deptNumber.HasValue)
                criteria.CreateCriteria("Item.Department", "Department").Add(Expression.Eq("Department.DepartmentNumber", deptNumber.Value));

            return criteria.List<Core.SuggestedOrderItem>();
        }
        catch (NHibernate.HibernateException he)
        {
            DataAccessException dae = new DataAccessException("NHibernate Exception", he);
            throw dae;                
        }

    }

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

<version name="Version" type="Int64" generated="always" column="ORA_ROWSCN" access="property" unsaved-value="0"/>

Большое спасибо за любую помощь!

UPDATE:

Я скачал nhprof, чтобы увидеть, был ли SQL-запрос, генерируемый в каждом случае, разным. Независимо от того, если я не отвечаю никаким критериям или я предоставляю критерии, они абсолютно одинаковы, за исключением условия where. Когда я выполнял каждый из запросов в редакторе БД, я получал те же результаты, что и у моего сервиса. Это какая-то странная проблема с оракулом? Если я включаю предложение where, я получаю разные числа ora_rowscn, в противном случае они все одинаковые.

1 Ответ

0 голосов
/ 01 декабря 2009

Оказывается, есть какая-то проблема при использовании ANSI Sql (я бью оракула 10 г дБ). Я добавил следующее свойство в свой app.config, чтобы попытаться заставить nhibernate не использовать ANSI:

<property name="use_outer_join">false</property>

Однако это не помогло. Затем я добавил:

<property name="max_fetch_depth">0</property>

Теперь количество обращений к дБ больше, но номера версий возвращаются, как и ожидалось.

...