我以为我有这个中间表作为HasMany映射中间表和HasOne中间和子之间的映射,但HasOne希望共享密钥。 (无反选项:[)与中间表的一对多映射
总之,关系结构,我有:
地址(儿童)
AddressId
..Address场
AddressCustomer(中介)
AddressCustomerId
AddressId
CustomerId
客户(家长)
客户编号
..Customer场
为什么我有这样的中介表,而不是一个正常的一对多的?因为会有其他实体需要包含地址。 (即网站等)他们将拥有自己的中间表,以便他们可以共享地址表。
映射我到目前为止有:
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列,行插入,但是AddressID从地址行不传播回升到CustomerAddress。 HasOne没有逆向选项,因此似乎是死路一条。我无法在CustomerAddress上生成Address ID,因为一旦添加了诸如SiteAddress之类的东西并且必须执行相同的操作,这会导致重复。那招可能使用GUID作为键,但我暂时与自动增量Ints卡住。
我正在讨论的一些其他想法是映射CustomerAddress和Address的合并,但我不认为Fluent NHibby支持这种想法。
我认为这是某人已成功应用的问题域。基本上我想要一个一对多的关系,其中子表(不是记录)在多个父母之间共享。有任何想法吗?
更新:尝试一些事情还没有完美的解决方案后。我也尝试过切换AddressID为GUID并设置它作为一个。参照(),而不是.HasOne(),其中CustomerAddress和网站地址(加入验证它工作)负责生成地址ID。它的工作原理,但我不知道我可以买入允许GUID PK/FK地址细节。 如果周围有引用或类似的东西,使地址生成它自己的钥匙,而且是更新CustomerAddress/SiteAddress我会兴高采烈的一个可能的解决方案。 –