假设我有以下表格:NHibernate:通过PK以外的东西链接集合
Company Person Address
----------------------------------------------------------------------------
Id (PK) Id (PK) Id (PK)
Name CompanyId (FK) CompanyId (FK)
AccessType AddressType
对应于以下C#.NET类:
class Company
{
int Id;
List<Person> Employees;
List<Address> Addresses;
}
class Person
{
int Id;
List<Address> CompanyAddresses;
}
class Address
{
int Id;
// ...
}
使用NHibernate在Company类上映射Person + Address集合非常容易:
<class name="Company" table="Company">
<id name="Id" column="Id" />
<set name="Employees" table="Person">
<key column="CompanyId" />
<one-to-many class="Person" />
</set>
<set name="Addresses" table="Address">
<key column="CompanyId" />
<one-to-many class="Address" />
</set>
</class>
<class name="Person" table="Person">
<id name="Id" column="Id" />
</class>
<class name="Address" table="Address">
<id name="Id" column="Id" />
</class>
我的问题是,如何将地址也映射到Person类?这个想法是,公司有一个人员(员工)和地址(站点)的列表,但公司地址也可以从公司的员工中查找。 (我知道,有点奇怪和非正统,但只是和我一起玩)。
通常,我可以通过在Person类映射上定义类似下面的内容来实现:
<set name="CompanyAddresses" table="Address">
<key column="CompanyId" property-ref="CompanyId" />
</set>
...但是Person(.NET)对象没有为property-ref
声明实现CompanyId属性拿水(我们不喜欢它)。
如何通过NHibernate在Person对象中保留一组地址,其中Person :: CompanyId = Address :: CompanyId?
谢谢你们。 :)
编辑
这实际上只是做了像迭戈建议的Person.Company.Addresses
映射,但遗憾的是,这不会完全奏效,因为公司会有一个地址列表,每个与公司相关联的人员只会拥有这些地址的子集。
我已经更新了上面的表模式。可以想象,如果Person具有AccessType = ENGINEER,那么只有AddressType = ENGINEERING Addresses将保留在其中(除了CompanyId = CompanyId)。
我认为,鉴别列可能有一定的潜力。 :)我会研究这一点,让你知道如何平息。 – 2010-09-02 21:44:34