nHibernate SQL 不可用错误
nHibernate SQL Not Available error
我有以下代码来执行一个简单的 select 语句。
鉴于 "SQL Not Available" 错误,此查询失败。
与模式相同的代码在大约 20 种不同的模型中工作得很好。
事实上,如果我更改 SQL 中实现的视图的设计以说隐藏 LoadID 列,查询将失败并显示“可以执行……因为 LoadID 不存在。
我的问题是当此代码、hbm.xml 模型和视图的设计都对齐时 ses.Query() 失败说明 "SQL not available"
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 视图的输出并将其转储到 table 中。
然后修改hbm.xlm指向table。
现在 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 应该已经 return 这种类型的对象。我认为它可能会搞砸 linq 提供程序,因为构造函数调用无法转换为 SQL。 linq 提供程序将处理 Select 语句,就好像它是一个普通的 IEnumerable
.
现在发生的是:
nHibernate 得到一个查询,其中只有这个:.Where(c => c.CustomerRecid == recid)
需要执行。所以 nHibernates 只查询对象的 ID(因为据 nHibernate 所知,它不需要更多的属性)。
这会给你 1, 2, 3, 4, 5, ...
等等。
一旦你的 Select
被执行(不是在数据库上),nHibernate 认为它需要其余的属性,所以它通过它们的 ID 一个一个地查询它们(不是很有效,有很多结果) .现在您使用 ROW_NUMBER
作为 ID 可能很危险,因为它只考虑当前结果集。当查询单个记录时,ROW_NUMBER
将始终为 1,因此 nHibernate 无法再找到您的其余对象。
我有以下代码来执行一个简单的 select 语句。 鉴于 "SQL Not Available" 错误,此查询失败。 与模式相同的代码在大约 20 种不同的模型中工作得很好。 事实上,如果我更改 SQL 中实现的视图的设计以说隐藏 LoadID 列,查询将失败并显示“可以执行……因为 LoadID 不存在。
我的问题是当此代码、hbm.xml 模型和视图的设计都对齐时 ses.Query() 失败说明 "SQL not available"
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 视图的输出并将其转储到 table 中。 然后修改hbm.xlm指向table。 现在 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 应该已经 return 这种类型的对象。我认为它可能会搞砸 linq 提供程序,因为构造函数调用无法转换为 SQL。 linq 提供程序将处理 Select 语句,就好像它是一个普通的 IEnumerable
.
现在发生的是:
nHibernate 得到一个查询,其中只有这个:.Where(c => c.CustomerRecid == recid)
需要执行。所以 nHibernates 只查询对象的 ID(因为据 nHibernate 所知,它不需要更多的属性)。
这会给你 1, 2, 3, 4, 5, ...
等等。
一旦你的 Select
被执行(不是在数据库上),nHibernate 认为它需要其余的属性,所以它通过它们的 ID 一个一个地查询它们(不是很有效,有很多结果) .现在您使用 ROW_NUMBER
作为 ID 可能很危险,因为它只考虑当前结果集。当查询单个记录时,ROW_NUMBER
将始终为 1,因此 nHibernate 无法再找到您的其余对象。