1

我以为我通过将中间表映射为 HasMany 并在中间表和子表之间映射为 HasOne 来固定这个,但是 HasOne 希望共享一个密钥。(没有反向选项。:[)

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

地址(子)
AddressId
..Address 字段

AddressCustomer(中介)
AddressCustomerId
AddressId
CustomerId

客户(父)
CustomerId
..Customer 字段

为什么我有这个中间表而不是普通的 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 表中可以为空的 AddressId 列,插入行,但是 Address 行中的 AddressID 不会传播回 CustomerAddress。HasOne 上没有 Inverse 选项,所以这似乎是一个死胡同。我不能在 CustomerAddress 上生成地址 ID,因为一旦我添加了类似 SiteAddress 的东西并且必须做同样的事情,这会导致重复。该技巧可能与 GUID 作为键一起使用,但我目前坚持使用自动增量 Ints。

我正在考虑的其他一些想法是映射 CustomerAddress 和 Address 的合并,但我不相信 Fluent NHibby 支持。

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

4

2 回答 2

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");
    }
}
于 2012-10-05T09:46:55.203 回答
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;
    }
}

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

于 2012-10-05T09:31:01.573 回答