2010-02-25 126 views
0

我有一个数据库有一个人和地址(使用人员ID)之间建模一对一的关系。但是,我找不到使用NHibernate制作地图的方法。映射表继承作为与NHibernate的一对一关系

我的表结构如下:

 
PersonTable 

PersonId 
PersonName 
PersonAge 

AddressTable 

PersonId 
CountryName 
StreetName 
StateName 

,我想有这样的事情作为最后一类:

 
PersonClass 

int Id 
string Name 
int Age 
Address HomeAddress 

AddressClass 

string Street 
string Country 
string State 
Person Owner 

我试着用HasOne关系,但我couldn't重用PersonId作为地址标识符。

谢谢!

编辑:我忘了提及我使用FluentNHibernate,所以流畅的映射和XML都会好的。

回答

0

我做了它使用Id().GeneratedBy.Foreign()在地址类映射引用它的人的ID和它的工作。

谢谢!

0

问题是您的数据库架构不代表Person和Address之间的“有一个”关系。它代表着“有许多”的关系;您可能会人为地将其限制为每个人一个地址,但这并不会改变模型是每个人多个地址的事实。

要获得“有一个”关系,您需要将AddressID放在PersonTable上。

+0

You're吧!这是一个“被迫”HasOne。我的真实模型与我用作示例的模型不同,但因为它与我国的税收相关,所以我认为我可以用这种简化来更好地解释它。无论如何,我仍然需要使用PersonId来获取它的地址。 – tucaz 2010-02-25 13:10:22

+0

如果您无法更改数据库模型以匹配您想要的数据模型,那么您可以将私有属性放在Person类的地址集合上,然后公开一个返回集合中第一个元素的公共属性。 – 2010-02-25 13:13:28

+0

我得到了。我的问题是我没有地址的ID。地址的ID是人员ID。如何使用它? – tucaz 2010-02-25 13:18:24

0

我会将它映射为Person的一个组件。在人类映射添加以下内容:

Component(x => x.Address, m => 
     { 
      m.Map(x => x.Street, "Street"); 
      m.Map(x => x.State, "State"); 
      // more here 
     }); 

干杯

+1

谢夫,地址在另一张桌子上。与人不一样。 – tucaz 2010-02-25 19:14:11

+0

我看到,这是一对一的事实,它没有被任何其他实体引用,并且它是一个值类型 - 我宁愿将它映射为一个获得某个perf的组件并丢失额外的连接和模式。非正规化我知道。只是我的2c – Chev 2010-02-26 05:51:02

+0

我同意你的看法。问题是我的数据库已经存在,我不能改变它以便两组信息共存于同一个表中,因此我可以使用Component。 – tucaz 2010-02-26 11:07:23