使用中间表进行一对多映射

我认为通过将中间表映射为HasMany以及作为HasOne的中间人和子映射之间的方法,我将这个挂起,但HasOne希望共享密钥。 (无反向选项。:[]

无论如何,我有关系结构:

地址(儿童)
AddressId
..地址字段

AddressCustomer(中介)
AddressCustomerId
AddressId
顾客ID

客户(父母)
顾客ID
..Customer Fields

为什么我有这个中间表而不是正常的1-many? 因为将有其他实体需要包含地址。 (即网站等)他们将拥有自己的中间表,以便他们可以共享地址表。

到目前为止我的映射:

public class CustomerAddressMap : ClassMap { public CustomerAddressMap() { Schema("dbo"); Table("CustomerAddress"); Id(x => x.CustomerAddressId); Map(x => x.FromDate) .Not.Nullable(); Map(x => x.ToDate); HasOne(x => x.Address) .ForeignKey("AddressId") .Cascade.All(); } } public class AddressMap : ClassMap
{ public AddressMap() { Schema("dbo"); Table("Address"); Id(x=>x.AddressId); Map(x => x.AddressType); } }

使用CustomerAddress表中的null -able AddressId列,将插入行,但Address行中的AddressID不会传播回CustomerAddress。 HasOne上没有反向选项,所以这似乎是一个死胡同。 我不能在CustomerAddress上生成地址ID,因为一旦我添加类似SiteAddress的东西,这将导致重复,并且必须做同样的事情。 这个技巧可以作为键使用GUID,但我暂时坚持使用自动增量Int。

我正在考虑的其他一些想法是映射CustomerAddress和Address的合并,但我不相信Fluent NHibby支持。

我认为这是一个有人成功应用的问题域。 基本上我想要一个1-多关系,其中子表(不是它的记录)在多个父项之间共享。 有任何想法吗?

将其映射为普通参考

 public class CustomerAddressMap : ClassMap { public CustomerAddressMap() { Table("CustomerAddress"); Id(x => x.CustomerAddressId); Map(x => x.FromDate).Not.Nullable(); Map(x => x.ToDate); References(x => x.Customer, "CustomerId"); References(x => x.Address, "AddressId"); } } 

为什么不从地址到客户进行一对多的转换? 客户将包含外键,地址实体可以由其他实体引用。 在这种情况下,您只需创建References(x => x.Address); 在客户桌上。
当我尝试使用FluentNHibernate创建一对一关系时,我也遇到了常见的问题。 如果你想要显示DB结构,我想你应该尝试以下映射(添加相应的实体字段):

  public AddressMap() { Schema("dbo"); Table("Address"); Id(x => x.AddressId); Map(x => x.AddressType); HasOne(x => x.CustomerAddress).Cascade.All(); } public CustomerAddressMap() { Schema("dbo"); Table("CustomerAddress"); Id(x => x.CustomerAddressId); Map(x => x.FromDate) .Not.Nullable(); Map(x => x.ToDate); HasOne(x => x.Address) .Constrained() .ForeignKey(); } 

这样的映射在我的情况下一边是空的,所以我修改了子实体的属性设置器(CustomerAddress):

 public virtual Address Address { get { return _address; } set { _address = value; value.CustomerAddress = this; } } 

在这些行动之后,一对一工作正常)希望它能帮助您解决问题。