[英]nHibernate SQL Not Available error
我有以下代码来执行简单的select语句。 鉴于出现“ SQL Not Available”错误,该查询失败。 与模式相同的代码在大约20种不同的模型中都可以正常工作。 实际上,如果我更改了用SQL实现的视图的设计以说隐藏LoadID列,则查询将失败,并说明“可以执行... ...,因为LoadID不存在。
我的问题是,当这段代码,hbm.xml模型和视图的设计都与ses.Query()对齐时,声明“ 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.Query()可以正常工作。 这不是可行的可能性。
请在InventoryRecid上发表评论。 在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语句。
现在发生的是: .Where(c => c.CustomerRecid == recid)
仅在以下位置获取查询: .Where(c => c.CustomerRecid == recid)
需要执行。 因此,nHibernate仅查询对象的ID(因为据nHibernate所知,它不再需要其他属性)。 这将为您提供1, 2, 3, 4, 5, ...
等。
一旦Select
执行(不在数据库上),nHibernate就会确定需要其余的属性,因此它会按ID逐一查询它们(效率不高,结果很多)。 现在,使用ROW_NUMBER
作为ID密码可能会很危险,因为它仅考虑了当前结果集。 查询单个记录时, ROW_NUMBER
始终为1,因此nHibernate不再能够找到其余的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.