首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据以下模式构造NHibernate查询?

如何根据以下模式构造NHibernate查询?
EN

Stack Overflow用户
提问于 2011-05-17 18:28:14
回答 1查看 369关注 0票数 0

我正在尝试构造一个NHibernate查询,以获取一个共享类可供销售的国家/地区的列表。

下面是AFS表的定义:

代码语言:javascript
复制
CREATE TABLE [MStar].[AFS](
    [AFS_ShareClassId] [int] NOT NULL,
    [AFS_CountryId] [int] NOT NULL,
 CONSTRAINT [PK_AFS] PRIMARY KEY CLUSTERED 
(
    [AFS_ShareClassId] ASC,
    [AFS_CountryId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [MStar].[AFS]  WITH CHECK ADD  CONSTRAINT [FK_AFS_Country] FOREIGN KEY([AFS_CountryId])
REFERENCES [MStar].[Country] ([Country_Id])
GO

ALTER TABLE [MStar].[AFS] CHECK CONSTRAINT [FK_AFS_Country]

这是Country表的定义:

代码语言:javascript
复制
CREATE TABLE [MStar].[Country](
    [Country_Id] [int] NOT NULL,
    [Country_ShortCode] [char](2) NULL,
    [Country_LongCode] [char](3) NOT NULL,
    [Country_RegionId] [char](3) NOT NULL,
    [Country_Name] [varchar](128) NOT NULL,
 CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED 
(
    [Country_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [MStar].[Country]  WITH CHECK ADD  CONSTRAINT [FK_Country_Region] FOREIGN KEY([Country_RegionId])
REFERENCES [MStar].[Region] ([Region_Id])
GO

ALTER TABLE [MStar].[Country] CHECK CONSTRAINT [FK_Country_Region]

首先,我尝试让这个查询尽可能简单,如下所示:

代码语言:javascript
复制
var afs = _session.CreateCriteria<AFS>().List<AFS>();

这总是不返回任何东西,即使我知道AFS和Country表中有(大量)内容,这表明我的映射文件有问题。

这是AFS映射:

代码语言:javascript
复制
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="FTMS.Domain"
                   namespace="FTMS.Domain.Entities">

    <class mutable="false" name="AFS" table="AFS" schema="MStar">
        <composite-id >
            <key-many-to-one name="ShareClass" column="AFS_ShareClassId" type="FTMS.Domain.Entities.ShareClass"></key-many-to-one>
        <key-many-to-one name="Country" column="AFS_CountryId" type="FTMS.Domain.Entities.Country"></key-many-to-one>
        </composite-id>

        <set name="Countries"
             inverse="true"
             lazy="true"
             cascade="save-update">
            <key column="Country_Id"></key>
            <one-to-many class="Country"/>
        </set>
    </class>
</hibernate-mapping>

这是国家/地区图:

代码语言:javascript
复制
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="FTMS.Domain"
                   namespace="FTMS.Domain.Entities">


  <class mutable="false" name="Country" table="Country" schema="MStar">

    <id name="Id" column="Country_Id">
      <generator class="native"></generator>
    </id>

    <property name="ShortCode" column="Country_ShortCode" />
    <property name="LongCode" column="Country_LongCode" />
    <property name="Name" column="Country_Name" />

      <set name="Funds" lazy="true">
            <key column="Fund_DomicileId"></key>
            <one-to-many class="Fund"/>
      </set>
  </class>
</hibernate-mapping>

..。通过所有这些,我得到了以下错误消息:

代码语言:javascript
复制
The 'type' attribute is not declared. 

理想情况下,结果应该是一个包含List<Country>的AFS对象。有没有什么明显的地方我做错了?

EN

回答 1

Stack Overflow用户

发布于 2011-05-17 18:43:16

好吧,这就是我认为的问题所在。

  1. 您的映射应该具有完整的程序集限定类型名称作为类元素中的名称attribtue。
  2. 您的属性元素应该具有它们所映射的类型的完整程序集限定类型名称。(这可能就是它所抱怨的,因为它提到了“类型”。

下面是我们的应用程序中的一个示例。

代码语言:javascript
复制
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" mutable="false" name="Civica.Common.Services.Web.Authorization.Model.Operation, Civica.Common.Services.Web, Version=1.0.4140.18095, Culture=neutral, PublicKeyToken=537c3450b3658434" table="`Operation`">
    <id name="Id" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="hilo">
        <param name="max_lo">10000</param>
      </generator>
    </id>
    <property name="Name" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Name" length="50" unique="true" />
    </property>
    <property name="TypeName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="TypeName" length="255" unique="true" />
    </property>
    <property name="Usage" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Usage" length="255" not-null="false" />
    </property>
    <property name="GroupingName" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="GroupingName" length="50" not-null="false" />
    </property>
  </class>
</hibernate-mapping>

注意:此映射是使用Fluent NHibernate API生成的。它可能包含一些你不需要的可选元素,但我不知道,因为我不做“手动”映射。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6029499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档