2012-10-04 52 views
1

我以为我有这个中间表作为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支持这种想法。

我认为这是某人已成功应用的问题域。基本上我想要一个一对多的关系,其中子表(不是记录)在多个父母之间共享。有任何想法吗?

+0

更新:尝试一些事情还没有完美的解决方案后。我也尝试过切换AddressID为GUID并设置它作为一个。参照(),而不是.HasOne(),其中CustomerAddress和网站地址(加入验证它工作)负责生成地址ID。它的工作原理,但我不知道我可以买入允许GUID PK/FK地址细节。 如果周围有引用或类似的东西,使地址生成它自己的钥匙,而且是更新CustomerAddress/SiteAddress我会兴高采烈的一个可能的解决方案。 –

回答

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"); 
    } 
} 
+0

胡人的修修补补,以让它使用GUID工作,我认为它实际上应该与INT ID的工作方式,所有我所要做的就是切换回类型,没想到它会工作。谢谢 :) –

0

为什么不从地址到客户进行一对多?客户将包含外键,地址实体可由其他实体引用。在这种情况下,您只需在客户表上制作References(x => x.Address);
当我尝试使用FluentNHibernate创建一对一关系时,我也遇到了一些常见问题。如果你想离开DB结构为你呈现,我想你应该尝试下面的映射(与添加相应的实体领域):在我的情况下离开了一面空

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

这些行为之后一对一工作正常)希望它能帮助你解决问题。