C# 具有中间表的一对多映射
我想我已经通过将中间表映射为HasMany,并将中间表和子表映射为HasOne来确定了这一点,但是HasOne希望共享一个键。(无反向选项。:[) 无论如何,我的关系结构是: 地址(子项)C# 具有中间表的一对多映射,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我想我已经通过将中间表映射为HasMany,并将中间表和子表映射为HasOne来确定了这一点,但是HasOne希望共享一个键。(无反向选项。:[) 无论如何,我的关系结构是: 地址(子项) 地址ID ..地址字段 地址客户(中介机构) AddressCustomerId 地址ID 客户ID 客户(母公司) 客户ID ..客户字段 为什么我有这个中间表而不是普通的1-many?因为还有其他实体需要包含地址(即站点等),它们将有自己的中间表,以便可以共享地址表 到目前为止,我有: pub
地址ID
..地址字段
地址客户(中介机构)
AddressCustomerId
地址ID
客户ID
客户(母公司)
客户ID
..客户字段 为什么我有这个中间表而不是普通的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);
}
}
公共类CustomerAddressMap:ClassMap
{
公共CustomerAddressMap()
{
模式(“dbo”);
表(“客户地址”);
Id(x=>x.CustomerAddressId);
映射(x=>x.FromDate)
.Not.Nullable();
Map(x=>x.ToDate);
HasOne(x=>x.Address)
.ForeignKey(“地址ID”)
.Cascade.All();
}
}
公共类地址映射:类映射
{
公共地址映射()
{
模式(“dbo”);
表(“地址”);
Id(x=>x.AddressId);
映射(x=>x.AddressType);
}
}
在CustomerAddress表中使用空的可寻址ID列时,会插入行,但是地址行中的AddressId不会传播回CustomerAddress。HasOne上没有反向选项,因此这似乎是一个死胡同。我无法在CustomerAddress上生成地址ID,因为一旦我添加像SiteAddress这样的东西,并且必须做同样的事情。这个技巧可能会使用GUI作为键,但我目前仍然坚持使用自动增量int
我正在讨论的其他一些想法是映射CustomerAddress和Address的合并,但我认为Fluent NHibby不支持这一点
我认为这是一个有人成功应用的问题域。本质上,我想要一个1-Many关系,其中包含子表(而不是它的记录)在多个家长之间共享。有什么想法吗?为什么不从地址到客户进行一对多转换?客户将包含外键,地址实体可以被其他实体引用。在这种情况下,您只需在客户表上进行
引用(x=>x.address);
。当我尝试使用FluentNHibernate创建一对一关系时,我也遇到了一些常见的问题。如果您想保留如图所示的DB结构,我想您应该尝试以下映射(添加相应的实体字段): 在我的例子中,这样的映射将一侧留空,因此我修改了子实体的属性setter(CustomerAddress):
在这些操作之后,一对一工作正常)希望它能帮助您解决问题。为什么不从一个地址到多个客户?客户将包含外键,地址实体可以被其他实体引用。在这种情况下,您只需在客户表上进行
引用(x=>x.address);
。当我尝试使用FluentNHibernate创建一对一关系时,我也遇到了一些常见的问题。如果您想保留如图所示的DB结构,我想您应该尝试以下映射(添加相应的实体字段): 在我的例子中,这样的映射将一侧留空,因此我修改了子实体的属性setter(CustomerAddress):
在这些措施一对一奏效后)希望它能帮助您解决问题。将其映射为正常参考
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");
}
}
公共类CustomerAddressMap:ClassMap
{
公共CustomerAddressMap()
{
表(“客户地址”);
Id(x=>x.CustomerAddressId);
Map(x=>x.FromDate).Not.Nullable();
Map(x=>x.ToDate);
参考(x=>x.客户,“客户ID”);
参考(x=>x.地址,“地址ID”);
}
}
将其映射为正常参考
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");
}
}
公共类CustomerAddressMap:ClassMap
{
公共CustomerAddressMap()
{
表(“客户地址”);
Id(x=>x.CustomerAddressId);
Map(x=>x.FromDate).Not.Nullable();
Map(x=>x.ToDate);
参考(x=>x.客户,“客户ID”);
参考(x=>x.地址,“地址ID”);
}
}
Update:在尝试了一些事情之后,仍然没有完美的解决方案。我尝试将AddressID切换为GUID,并将其设置为.Reference(),而不是.HasOne(),其中包含CustomerAddress和Site Address(添加以验证其工作正常)我们负责生成地址ID。这是可行的,但是我不确定我是否能够获得认可,以便为地址详细信息提供GUID PK/FK。如果有可能的解决方案围绕引用或类似内容,允许地址生成自己的密钥,并在CustomerAddress/SiteAddress中更新,我将感到高兴。更新:之后尝试一些事情仍然不是完美的解决方案。我尝试将AddressID切换为GUID,并将其设置为.Reference(),而不是.HasOne(),其中包含CustomerAddress和站点地址(添加以验证其是否工作)我们负责生成地址ID。这是可行的,但是我不确定我是否能够获得认可以允许地址详细信息的GUID PK/FK。如果有可能的解决方案围绕引用或类似内容,允许地址生成自己的密钥并在CustomerAddress/SiteAddress中更新,我将感到高兴。Aw man,ti为了使它能够以我认为它实际上应该与int-ID一起工作的方式使用GUID,我所要做的就是切换回类型,我认为它不会工作。谢谢:)哦,伙计,为了使它能够以我认为它应该与int-ID一起工作的方式进行修补,我所要做的就是切换回类型,我认为不会会有用的。谢谢:)
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");
}
}