繁体   English   中英

nHibernate SQL不可用错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM