【发布时间】:2009-11-30 16:29:44
【问题描述】:
我有一个方法可以返回建议订单的列表。如果用户传递一个空值,则该条件将被忽略。
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;
}
}
如果我提供标准,一切正常。好的,我的意思是它检索正确的建议订单,它们都有不同的版本号。如果所有条件都为空,它会按原样检索所有建议的订单,但是版本号都是相同的。另一位开发人员正在处理 UI,他正在调用上述方法来填充所有订单的屏幕,以便用户可以选择一个进行修改。当我收到他的更新请求时,虽然我拒绝了它,因为版本号与对象的实际版本不匹配。这是版本列在映射文件中的样子:
<version name="Version" type="Int64" generated="always" column="ORA_ROWSCN" access="property" unsaved-value="0"/>
非常感谢您的帮助!
更新:
我下载了 nhprof 以查看每种情况下生成的 sql 查询是否不同。无论我是否通过任何标准,或者我确实提供了一个标准,它们都是完全相同的,除了 where 子句。当我在数据库编辑器中运行每个查询时,我得到的结果与我从服务中看到的结果相同。这是某种奇怪的预言机问题吗?如果我包含 where 子句,我会得到不同的 ora_rowscn 数字,否则它们都是相同的。
【问题讨论】:
-
您的级联策略如何?您确定您没有对该项目执行任何更新吗? Generated="always" 将在每次写入操作时增加版本列。如果您不确定,请尝试记录生成的 sql 并搜索此项目上的任何不需要的更新。
-
我没有在我的任何映射文件中设置级联选项。对于任何集合,我都使用多对一。我用了NHProf,没有看到任何意外更新,只是一个选择。如上所述,如果我对数据库运行选择,我会得到相同的结果。我认为这是一个奇怪的预言机问题。
标签: oracle nhibernate versioning criteria