NHibernate在主键上一对多映射

标签 nhibernate nhibernate-mapping one-to-many

我正在使用旧版数据库,并且有以下表格:

Person                  ExternalFile
------                  ------------
Id           (int, PK)  Key           (string)
ConnectionId (int)      Type          (int)
Name         (string)   ConnectionId  (int)
Firstname    (string)   Path          (string)
                        Id            (int, PK)

一个人有许多外部文件。

给出的例子:
Person A                ExternalFile1          ExternalFile2
--------                -------------          -------------
Id: 1                   Key: 'WN'              Key: 'WN'
ConnectionId: 29        Type: 4                Type: 4
Name: 'Foo'             ConnectionId: 29       ConnectionId: 29
Firstname: 'Bar'        Path: 'C:/file1.txt'   Path: 'D:/file2.txt'
                        Id: 1                  Id: 2

我可以对此进行映射,以便用户拥有一袋ExternalFiles吗?

我的映射文件

外部文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Not.Relative" assembly="Not">
  <class name="ExternalFile" table="tbl_externalfiles" lazy="false">
    <id name="Id" column="`Id`">
      <generator class="identity" />
    </id>
    <property name="Key" column="`CDKey`" />
    <property name="ConnectionId" column="`KeyValue`" />
    <property name="Type" column="`DocType`"  />
    <property name="Path" column="`Path`" />
  </class>
</hibernate-mapping>

人:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Not.Relative" assembly="Not">
  <class name="Person" table="tbl_person" lazy="false">
    <id name="Id" column="`Id`">
      <generator class="identity" />
    </id>
    <property name="ConnectionId" column="`pairid`" />
    <property name="Name" column="`name`" />
    <property name="Firstname" column="`firstname`"  />
  </class>
</hibernate-mapping>

我的查询如下所示:
SELECT * 
FROM tbl_externalfiles
WHERE KeyValue = @p0
AND   CDKey = @p1
AND   DocType = @p2

@p0 = 29, @p1 = 'WN', @p2 = 4

所以我必须给包中的3个参数(从人员到外部文件),

1:该人的ConnectionID

2:“WN” <-始终相同(键)

3:4 <-始终相同(类型)

在多对一的情况下,当我映射到组合ID时可以使用,但是在这种情况下我不能使用它。

在这里甚至可以提包吗?我应该只使用一个额外的查询来获取我的ExternalFiles,还是使用一个条件进行查询。

编辑:

我知道我只能对connectionId执行以下操作
<bag name="Files" lazy="false">
  <key column="KeyValue" property-ref="ConnectionId"/>
  <one-to-many class="ExternalFile" />
</bag>

但是我也不知道如何在其中获取Type和Key参数。

谢谢

最佳答案

试试这个

   <bag name="Files" lazy="false" where="DocType = '4' AND CDKey = 'WN'">
      <key column="KeyValue" property-ref="ConnectionId" />
      <one-to-many class="ExternalFile" />
    </bag>

关于NHibernate在主键上一对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12314191/

相关文章:

c# - NHibernate 多个带有 in 子句的子查询

nhibernate - Nhibernate 映射文件中的硬编码值

c# - 使用子集合更新 NHibernate 对象

NHibernate 2.* 映射文件 : how to define nullable DateTime type (DateTime? )?

nhibernate - 使用 NHibernate 的可扩展领域模型

.net - 如何将 NHibernate 与 System.Tuple 等不可变类型一起使用?

mysql - 在 MySQL 中,如何使用表 A 将两个表与其自身建立一对多关系?

java - Spring 3 MVC : one-to-many within a dynamic form (add/remove on create/update)

Mysql 多对一或一对多

c# - 在 NHibernate 3.3 中使用 Fluent NHibernate