我有这样的地址表如下:
Address
-------
ID (pk)
OWNERTYPE (int)
OWNERID (int)
ADDR1
ADDR2
....
这是一个“子”表,它将映射到任何可能的“父”表。为了区分它与哪个父表有关系,它有“ONWERTYPE”列。 “OWNERTYPE”将存储与其相关的父表的标识符,而“OWNERID”将保存父表的主键(这是外键列)。
如何将此关系映射到父表?
p / s:
答案 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实体和映射上显示,基本上它与用户表具有相同的概念。请原谅我在这里输入的任何语法错误,因为如果没有文档可供参考,真正的实体名称并不直观。