【问题标题】:Nhibernate versioning problem休眠版本控制问题
【发布时间】: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


【解决方案1】:

原来在使用 ANSI Sql 时存在某种问题(我正在使用 oracle 10g db)。我在 app.config 中添加了以下属性,以尝试让 nhibernate 不使用 ANSI:

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

但是,这并没有帮助。然后我补充说:

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

现在有更多的数据库命中,但版本号按预期恢复。

【讨论】:

  • 我更新到 NH2.1,它允许我使用 oracle 10 方言。我能够删除上面的 2 个属性,因为它没有生成 ansi sql,所以我没有提到原始问题。
猜你喜欢
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 2012-09-17
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多