Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有中间表的一对多映射_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 具有中间表的一对多映射

C# 具有中间表的一对多映射,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我想我已经通过将中间表映射为HasMany,并将中间表和子表映射为HasOne来确定了这一点,但是HasOne希望共享一个键。(无反向选项。:[) 无论如何,我的关系结构是: 地址(子项) 地址ID ..地址字段 地址客户(中介机构) AddressCustomerId 地址ID 客户ID 客户(母公司) 客户ID ..客户字段 为什么我有这个中间表而不是普通的1-many?因为还有其他实体需要包含地址(即站点等),它们将有自己的中间表,以便可以共享地址表 到目前为止,我有: pub

我想我已经通过将中间表映射为HasMany,并将中间表和子表映射为HasOne来确定了这一点,但是HasOne希望共享一个键。(无反向选项。:[)

无论如何,我的关系结构是:

地址(子项)
地址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");
    }
}