NHibernate 버전화 문제
-
10-07-2019 - |
문제
제안 된 주문 목록을 반환 할 방법이 있습니다. 사용자가 널을 통과하면 해당 기준이 무시됩니다.
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;
}
}
기준을 제공하면 모든 것이 잘 작동합니다. 괜찮다는 것은 올바른 제안 된 주문을 검색하고 모두 다른 버전 번호를 가지고 있음을 의미합니다. 모든 기준이 NULL 인 경우 제안 된 모든 주문을 검색하지만 버전 번호는 모두 동일합니다. 다른 개발자가 UI를 작업 중이며 위의 방법을 호출하여 모든 주문으로 화면을 채우므로 사용자가 수정할 하나를 선택할 수 있습니다. 버전 번호가 객체의 실제 버전과 일치하지 않으므로 업데이트 요청을 받으면 거부합니다. 버전 열이 매핑 파일에서 보이는 방식입니다.
<version name="Version" type="Int64" generated="always" column="ORA_ROWSCN" access="property" unsaved-value="0"/>
도움을 주셔서 대단히 감사합니다!
업데이트:
각 경우에 생성되는 SQL 쿼리가 다른지 확인하기 위해 NHPROF를 다운로드했습니다. 기준을 전달하지 않든 기준을 제공하든 기준을 제공하더라도 WHERE 절을 제외하고는 정확히 동일합니다. DB 편집기에서 각 쿼리를 실행했을 때 서비스에서 볼 수있는 것과 동일한 결과를 얻었습니다. 이것은 이상한 오라클 문제입니까? WHERE 절을 포함하면 다른 ORA_ROWSCN 번호를 얻습니다. 그렇지 않으면 모두 동일합니다.
해결책
ANSI SQL을 사용할 때 일종의 문제가 있습니다 (Oracle 10G DB를 치고 있습니다). alsi를 사용하지 않도록 nhibernate를 얻기 위해 다음 속성을 내 app.config에 추가했습니다.
<property name="use_outer_join">false</property>
그러나 이것은 도움이되지 않았습니다. 그런 다음 다음을 추가했습니다.
<property name="max_fetch_depth">0</property>
이제 더 많은 DB 히트가 있지만 버전 번호는 예상대로 돌아오고 있습니다.