NHibernate将子映射到多个可能的父级

时间:2011-06-27 13:10:47

标签: nhibernate nhibernate-mapping

我有这样的地址表如下:

Address
-------
ID (pk)
OWNERTYPE (int)
OWNERID (int)
ADDR1 
ADDR2
....

这是一个“子”表,它将映射到任何可能的“父”表。为了区分它与哪个父表有关系,它有“ONWERTYPE”列。 “OWNERTYPE”将存储与其相关的父表的标识符,而“OWNERID”将保存父表的主键(这是外键列)。​​

如何将此关系映射到父表?

p / s:

  • 父表没有 表示其关系的列 孩子。
  • 父表有自己的实体代表

2 个答案:

答案 0 :(得分:1)

您需要使用<any>映射,如here所述。

答案 1 :(得分:0)

我找到了另一个解决方案但是我需要建议我是否采取了正确的方法。 数据库表本身并不是我设计的,因此我无法帮助,只能遵循结构。

因为所有地址数据只存储在一个表中,所以我使用继承映射来执行此操作。

例如我有3个这样的表;

地址表

Address
-------
ID (pk)
ownertype (string)
ownerid (int)
addr1
postcode
...

用户表

User
-----
ID (pk)
name
...

组织表

Org
----
ID (pk)
Orgname
....

根据我的DBA,她说User和Org表都与地址表有关,它由地址表中的ownertype列区分。

所以,我创建了一个具有所有常见属性的基本实体“Address”:

public abstract class Address {
  public virtual string addr1 { get;set; }
  public virtual int postcode { get;set; }
  ...
}

然后对于地址表的每个父表关系,我创建了另一个子类的地址(从类Address派生)并使得父实体关系到这个子类而不是Address类,如下所示:

地址

的UserAddress子类
public class UserAddress : Address {
  public virtual User Owner { get;set; }
}

用户实体

public class User {
  public virtual int ID { get;set; }
  public virtual string Name { get;set; }

  public virtual UserAddress Address {
    get {
      return address;
    }
    set {
      if (value != null) 
        value.Owner = this
      address = value
    }
  }
}

并且Adderss,UserAddress和user的映射如下所示:

地址及其子类(每个类层次结构策略的表):

<class name="Address" table="Address" abstract="true">
  <id name="ID">
    <generator class="identity"/>
  </id>
  <discriminator column="Ownertype" type="System.String" />
  <property name="addr1 />
  <property name="postcode" />
  ....
  <subclass name="UserAddress" discriminator-value="USER">
    <many-to-one name="Owner" column="Ownerid" />
  </subclass>
  <subclass name="OrgAddress" discriminator-value="ORG">
    <many-to-one name="Owner" column="Ownerid" />
  </subclass>
</class>

用户:

<class name="User" table="User">
  <id name="ID">
    <generator class="identity"/>
  </id>
  <property name="Name" />
  ....
  <one-to-one name="Address" property-ref="Owner" cascade="all" />
</class>

这是正确的方法吗?除此之外,还给我任何其他更好的选择。

注意:我没有在Org实体和映射上显示,基本上它与用户表具有相同的概念。请原谅我在这里输入的任何语法错误,因为如果没有文档可供参考,真正的实体名称并不直观。