使用中间表进行一对多映射

时间:2012-10-04 22:55:11

标签: c# nhibernate fluent-nhibernate

我认为通过将中间表映射为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关系,其中子表(不是它的记录)在多个父项之间共享。有什么想法吗?

2 个答案:

答案 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;
    }
}

在这些行动之后,一对一工作正常)希望它能帮助您解决问题。