映射表继承作为与NHibernate的一对一关系

映射表继承作为与NHibernate的一对一关系,nhibernate,fluent-nhibernate,map,one-to-one,Nhibernate,Fluent Nhibernate,Map,One To One,我有一个数据库,它在一个人和一个地址(使用个人id)之间建立了一对一的关系模型。但是,我找不到一种使用NHibernate制作地图的方法 我的表格结构如下: PersonTable PersonId PersonName PersonAge AddressTable PersonId CountryName StreetName StateName Component(x => x.Address, m => { m.Map(x =&g

我有一个数据库,它在一个人和一个地址(使用个人id)之间建立了一对一的关系模型。但是,我找不到一种使用NHibernate制作地图的方法

我的表格结构如下:

PersonTable PersonId PersonName PersonAge AddressTable PersonId CountryName StreetName StateName
 Component(x => x.Address, m =>
        {
            m.Map(x => x.Street, "Street");
            m.Map(x => x.State, "State");
            // more here
        });
可人的 拟人 人名 名人 地址表 拟人 国名 街道名称 州名 我想在最后一节课上有这样的内容:

PersonClass int Id string Name int Age Address HomeAddress AddressClass string Street string Country string State Person Owner 个人阶级 整数Id 字符串名 智力年龄 地址家庭地址 地址类 弦街 弦国 字符串状态 个人所有者 我尝试使用HasOne关系,但无法将PersonId重新用作地址标识符

谢谢


编辑:我忘了提到我正在使用FluentNHibernate,所以FluentNHibernate映射和XML都很好。

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

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

我在Address类映射中使用Id().GeneratedBy.Foreign()将其引用到Person的Id,这样做是有效的


谢谢

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

PersonTable PersonId PersonName PersonAge AddressTable PersonId CountryName StreetName StateName
 Component(x => x.Address, m =>
        {
            m.Map(x => x.Street, "Street");
            m.Map(x => x.State, "State");
            // more here
        });

干杯

你说得对!这是一个“被迫”的哈桑。我的真实模型与我作为例子使用的模型不同,但由于它与我的国家的税收相关,我认为我可以通过这种简化更好地解释它。无论如何,我仍然需要使用PersonId来获取它的地址。如果您无法更改数据库模型以匹配您想要的,那么您可以在Person类上放置一个私有属性,该类是一个地址集合,然后公开一个公共属性,该属性返回集合中的第一个元素。我的问题是我没有地址的ID。Addresses’s ID是个人ID。如何使用它?Chev,地址在另一张表上。与Person不同。我看到,作为1对1,它没有被任何其他实体引用,并且是一种值类型,我宁愿将其映射为一个组件,以获得一些性能,并失去额外的连接和模式。非规范化我知道。我同意你的看法。问题是我的数据库已经存在,我无法更改它,以便两组信息同时存在于同一个表中,以便我可以使用组件。