NHibernate 遗留数据库多对一

标签 nhibernate nhibernate-mapping

我面临着 NH 和旧数据库的映射关系问题。

我们有两张 table

Table1 [
   Id primary Key (sql identity)
   Cod1,
   Cod2 ]

然后是第二个表

Table2 [
   CompositeCode primary key (assigned),
   Cod1,
   Cod2 ]

CompositeCode 是一个计算字段,即 Cod1 + Cod2,并且是表的键。

我正在尝试以这种方式映射 Table1 和 Table2 之间的只读多对一关系

<class name="Table2"  >
  <id name="Id" >
     <generator class="identity" />
 </id>
 <many-to-one name="Table2" 
             formula="SELECT C.CompositeCode FROM Table2 C WHERE C.Cod1= Cod1 AND C.Cod2 = Cod2"/>
  <property name="Cod1" />
  <property name="Cod2" />
</class>

NHibernate 在访问数据库时给我这个错误:

'Incorrect syntax near the keyword 'SELECT'.

这是生成的 SQL

 SELECT TOP (100) this_.Id as Id1_37_0_, 
 this_.Cod1 as Cod1l3_37_0_, 
 this_.Cod2 as Cod24_37_0_, 
 SELECT this_.CompositeCode  FROM Table2 C WHERE this_.Cod1 = C.OCd1 AND this_.Cod2 =  C.COd2 as formula0_0_ 
 FROM Table1 this_ 

出了什么问题?

我也尝试将形式更改为

  formula="SELECT C.CompositeCode FROM Table2 C WHERE C.CompositeCode = Cod1 + Cod2"

但运气不佳!

附注NH是3.1版本

最佳答案

执行子选择的公式语句必须括在大括号(SELECT ...):

formula="(SELECT C.CompositeCode FROM Table2 C WHERE C.CompositeCode = Cod1 + Cod2)"

注意:我尝试了类似的场景并且它有效。除了生成的代码不是

...
,(SELECT this_.CompositeCode  FROM Table2 C .. // this_.ComositeCode

但是

...
,(SELECT C.CompositeCode  FROM Table2 C .. // C.CompositeCode

关于NHibernate 遗留数据库多对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13927563/

相关文章:

nhibernate - NHibernate 可以使用 2 种不同的架构吗?

nhibernate - 使用按位运算符时 HQL 到 CriteriaQuery

mysql - Nhibernate 将多个表映射到同一个列表

nhibernate - 映射可能没有行的扩展表

nhibernate - 为什么我在构建 NHibernate session 工厂时会得到 "read-only cache configured for mutable"?

c# - NHibernate 和 Byte[] 作为主键

nhibernate - 在HQL中使用CASE语句选择

nhibernate - NHibernate FetchMany 在两个以上的表上是否损坏?

nhibernate - SchemeExport 和创建多对多表的主键

c# - 如何覆盖NHibernate的类映射Where子句?