我认为通过将中间表映射为HasMany以及作为HasOne的中间人和子映射之间的关系,我认为这是一个挂钩,但HasOne希望共享密钥。 (无反向选项。:[]
无论如何,我有关系结构:
地址(儿童)
AddressId
..地址栏
AddressCustomer(Intermediary)
AddressCustomerId
AddressId
客户编号
客户(父母)
客户编号
..Customer Fields
为什么我有这个中间表而不是正常的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表中的null -able AddressId列,将插入行,但Address行中的AddressID不会传播回CustomerAddress。 HasOne上没有反向选项,所以这似乎是一个死胡同。我不能在CustomerAddress上生成地址ID,因为一旦我添加类似SiteAddress的东西,这将导致重复,并且必须做同样的事情。那个技巧可以使用GUID作为键,但我暂时停留在自动增量Ints上。
我在讨论的一些其他想法是映射CustomerAddress和Address的合并,但我不相信Fluent NHibby支持。
我认为这是某个人已成功应用的问题域。基本上我想要1-Many关系,其中子表(不是它的记录)在多个父项之间共享。有什么想法吗?
答案 0 :(得分:1)
将其映射为普通参考
public class CustomerAddressMap : ClassMap<CustomerAddress>
{
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");
}
}
答案 1 :(得分:0)
为什么不从地址到客户进行一对多的转换?客户将包含外键,地址实体可以由其他实体引用。在这种情况下,您只需在客户表上创建References(x => x.Address);
当我尝试使用FluentNHibernate创建一对一关系时,我也遇到了常见的问题。如果你想要显示的数据库结构,我想你应该尝试以下映射(添加相应的实体字段):
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;
}
}
在这些行动之后,一对一工作正常)希望它能帮助您解决问题。