n休眠 SQL 不可用错误

本文关键字:错误 休眠 SQL | 更新日期: 2023-09-27 17:55:30

我有以下代码来执行一个简单的选择语句。此查询失败,因为出现"SQL 不可用"错误。这种与模式相同的代码在大约 20 种不同的模型中工作得很好。事实上,如果我更改在 SQL 中实现的视图的设计,说隐藏 LoadID 列,查询将失败,指出"可以执行......因为 LoadID 不存在。

我的问题是,当这段代码、hbm.xml 模型和视图的设计都与 ses 对齐时。查询() 失败,指出"SQL 不可用"

var rows = ses.Query<vInventory>().Where(c => c.CustomerRecid == recid).Select(c => new vInventory()
{
    InventoryRecid = c.InventoryRecid
    , ItemID = c.ItemID
    , LoadID = c.LoadID
    , CustomerRecid = c.CustomerRecid
}).ToList();

这是映射。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="Asmbly" namespace="Asmbly.Models">
  <class name ="vInventory" table="dbo.vInventory" dynamic-update="true">
    <cache usage="read-only"/>
    <id name="InventoryRecid" column="InventoryRecid" type="Int64">
      <generator class="native" />
    </id>
    <property name="ItemID" />
    <property name="LoadID" />
    <property name="CustomerRecid" />
  </class>
</hibernate-mapping>

更新。 我获取了 SQL 视图的输出并将其转储到表中。然后修改了 hbm.xlm 以指向该表。现在的ses。查询() 工作正常。 这不是一个可行的可能性。

请对库存回复发表评论。 在 SQL 视图中,此属性为

ROW_NUMBER() over (...)

如何让 nHibernate 使用此视图并利用 InventoryRecid 属性?我永远不会尝试更新此实体。

更新#2:我将 hbm.xlm 映射从

<class name ="vInventory" table="dbo.vInventory" dynamic-update="true">

<class name ="vInventory" table="dbo.vInventory" dynamic-update="false">

重新编译,我的问题消失了。

不幸的是,我将其改回 true 并重新编译,但我的问题没有回来。

n休眠 SQL 不可用错误

Select方法中创建vInventory的新实例是否有特殊原因? nHibernate应该已经根据您的映射返回这种类型的对象。我认为这可能会搞砸linq提供程序,因为构造函数调用无法转换为SQL。linq 提供程序将像处理普通IEnumerable一样处理 Select 语句。

现在发生的情况是:nHibernate得到一个查询,其中只有这个:.Where(c => c.CustomerRecid == recid)需要被执行。所以nHibernates只查询对象的ID(因为据nHibernate所知,它不需要更多的属性)。这会给你1, 2, 3, 4, 5, ...等等。

一旦你的Select被执行(不在数据库上),nHibernate就会认为它需要其余的属性,所以它通过它们的ID一个接一个地查询它们(效率不是很高,有很多结果)。现在,使用 ROW_NUMBER 作为 ID wchich 可能很危险,因为它只考虑当前结果集。查询单个记录时,ROW_NUMBER将始终为 1,因此 nHibernate 无法再找到其余对象。