2009-11-30 2 views
0

У меня есть метод, который вернет список предлагаемых заказов. Если пользователь передает null, критерии игнорируются.Проблема с версией Nhibernate

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. Когда я запускал каждый из запросов в редакторе db, у меня были те же результаты, что и у меня на службе. Это какая-то странная проблема оракула? Если я включаю предложение where, я получаю разные числа ora_rowscn, в противном случае они все одинаковы.

+0

Как ваша стратегия в каскаде? Вы уверены, что не выполняете какое-либо обновление элемента? Generated = "always" будет увеличивать столбец версии для каждой операции записи. Если вы не уверены в попытке зарегистрировать сгенерированный sql и искать любое нежелательное обновление этого элемента. – zoidbeck

+0

Я не задал параметр каскада в любом из моих файлов сопоставления. Для любых коллекций я использую много-к-одному. Я использовал NHProf, не видел никаких неожиданных обновлений, просто выберите. Как указано выше. Если я запускаю выборки по БД, я получаю те же результаты. Я думаю, что это странная проблема оракула. –

ответ

0

Похоже, что существует какая-то проблема при использовании ANSI Sql (я нажимаю оракул 10g db). Я добавил следующее свойство к моему app.config, чтобы попытаться получить NHibernate не использовать ANSI:

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

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

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

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

+0

Я обновился до NH2.1, что позволило мне использовать диалект оракула 10. Я смог удалить 2 свойства выше, и поскольку он не создает ansi sql, у меня нет упомянутой оригинальной проблемы. –

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