我以为我通过将中间表映射为 HasMany 并在中间表和子表之间映射为 HasOne 来固定这个,但是 HasOne 希望共享一个密钥。(没有反向选项。:[)
无论如何,我的关系结构:
地址(子)
AddressId
..Address 字段
AddressCustomer(中介)
AddressCustomerId
AddressId
CustomerId
客户(父)
CustomerId
..Customer 字段
为什么我有这个中间表而不是普通的 1-many?因为会有其他实体需要包含地址。(即站点等)他们将拥有自己的中间表,因此他们可以共享地址表。
我到目前为止的映射:
public class CustomerAddressMap : ClassMap<CustomerAddress>
{
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<Address>
{
public AddressMap()
{
Schema("dbo");
Table("Address");
Id(x=>x.AddressId);
Map(x => x.AddressType);
}
}
使用 CustomerAddress 表中可以为空的 AddressId 列,插入行,但是 Address 行中的 AddressID 不会传播回 CustomerAddress。HasOne 上没有 Inverse 选项,所以这似乎是一个死胡同。我不能在 CustomerAddress 上生成地址 ID,因为一旦我添加了类似 SiteAddress 的东西并且必须做同样的事情,这会导致重复。该技巧可能与 GUID 作为键一起使用,但我目前坚持使用自动增量 Ints。
我正在考虑的其他一些想法是映射 CustomerAddress 和 Address 的合并,但我不相信 Fluent NHibby 支持。
我认为这是有人成功应用的问题域。本质上,我想要一个 1-Many 关系,其中子表(不是它的记录)在多个父级之间共享。有任何想法吗?