nHibernate将实体映射到多个不同的父实体(例如Addres - > Firm,Addres - > Client)

时间:2010-05-03 17:35:32

标签: nhibernate mapping entity automapping

有人可以帮我找到流利的nHibernate中映射以下情况的最佳方法吗? Address类在Client和Company中使用。如何在SQL中最有效地存储它?那个映射应该是什么样的?我考虑过多种选择,但在这些情况下我对nHibernate的经验不足:

  1. 使用1个地址实体和1个表,并使用分母列来区分客户地址和公司地址 - >如何在nHibernate中实现它?

  2. 使用1个地址实体和2个表(ClientAddresses和CompanyAddresses) - >但我只能在类Address

  3. 的映射中定义1个表
  4. 使用2个地址实体和2个表 - >不那么优雅

  5. 当我开始实施公司类并意识到它还需要多个地址时,我偶然发现了这个问题。到目前为止,我有一个Address和Client类,并且它们之间有一对多的映射。在数据库中,Address有一个名为ClientId的额外列。但是通过介绍公司课程,我被困住了......

    非常感谢任何帮助。

    我目前正在使用sharparch 1.5框架,它使用自动化,我的映射文件是这样的:

    public class AddressMap : IAutoMappingOverride<Address>
    {
        public void Override(AutoMapping<Address> mapping)
        {
            mapping.Table("addresses");
            mapping.Id(x => x.Id, "AddressGuid")
                 .UnsavedValue(Guid.Empty)
                 .GeneratedBy.GuidComb();
    
            mapping.References(x => x.Client, "ClientGuid");
    
        }
    }
    

    下面是一些代码,说明问题:

    地址

    public class Address
    {
       public virtual string StreetLine1 { get; set; }
       public virtual string StreetLine2 { get; set; }
       public virtual string PostalCode { get; set; }
       public virtual string City { get; set; }
       public virtual string Country { get; set; }
    }
    

    有下表:

      

    tablename =地址
      fields = AddressGuid,StreetLine1,StreetLine2,PostalCode,City,Country

    客户端

    public class Client
    {
        public IList<Address> Addresses {get;set;}
    }
    

    公司

    public class Company
    {
        public IList<Address> Addresses {get;set;}
    }
    

2 个答案:

答案 0 :(得分:1)

看起来您可以使用nHibernate的<any>映射实现#1。请注意,在这种情况下,您无法指定外键约束。

an example of <any>

Fluent nHibernate syntax

答案 1 :(得分:0)

您可以将关系建模为多对多关系:许多公司到多个地址,许多客户到多个地址。

在公司和客户端映射中:

mapping.HasManyToMany(x => x.Addresses);

这将创建另外两个表:一个是公司和地址之间的映射,另一个是客户端和地址之间的映射。

理论上,这可能允许您可能不想要的共享情况(一些公司和所有共享的客户都有相同的地址行),但只要您的应用程序逻辑不允许这种情况发生,您就会很好,你不必用nhibernate做任何棘手的事。