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 并重新编译,但我的问题没有回来。
在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 无法再找到其余对象。