使用CreateQuery时排除“未映射”错误

时间:2009-10-19 16:58:41

标签: c# nhibernate nhibernate-mapping

我有一组表,每个表都有一个.hbm.xml。

我试图输入一个命名查询,但它不会编译。我将代码移动到CreateQuery并获取。

  

未映射DB_Portfolio [select   总和(p.Shares * s.Price)来自   DB_Portfolio p,DB_Securities s   其中p.AccountNumber =   :accountNumber和p.CUSIP = s.Cusip]

CreateQuery语句看起来像。

  IQuery queryBack = session.CreateQuery("select sum(p.Shares * s.Price) from  DB_Portfolio  p, DB_Securities  s where  p.AccountNumber = :accountNumber and p.CUSIP = s.Cusip");

queryBack.SetString("accountNumber", accountNumber);


  return  queryBack.UniqueResult<Decimal>();

我有DB_Portfolio .hbm.xml

<many-to-one name="Security" class="BDM_Controller.Source.ORM.DB_Securities, BDM_Controller" column="Cusip"/>

在Portofoio中使用外键,在Cusip上具有安全性。

我在这里缺少什么?

Visual Studio 2008,NHibernate 2.1.0.4000,MS SqlServer 2005

2 个答案:

答案 0 :(得分:3)

在我看来,DB_Portfolio是您的数据库表名,而不是类名。在HQL查询中,您应该使用类名而不是数据库表名。

如果“DB_Portfolio”实际您的类名:是.hbm.xml文件的构建操作设置为“嵌入资源”吗? (如果不是,请这样做。)

这是猜测,因为您没有发布DB_Portfolio映射文件。如果您想要更复杂的答案,请发布完整的映射文件和类定义。

答案 1 :(得分:0)

我在hibernate映射文件中计算了列。请参阅以下示例中的公式:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="MyModule.DisciplineDTO, MyModule" table="Disciplines">
    <id name="Id" column="DisciplineID" length="15">
      <generator class="assigned"/>
    </id>
    <property name="Preference" formula="'TM.D.'+DisciplineID" update="false" insert="false"/>
  </class>
</hibernate-mapping>

更新和插入属性告诉nHibernate如果将此对象写入数据库,则在构造update和insert语句时不使用此列。 您还应该指定列的数据类型。