nHibernate将BaseClass映射到多个表

时间:2014-04-24 12:59:13

标签: c# nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我有一组共享一些类似属性的对象,因此它们从基类继承这些属性。这是我正在做的一个简单的例子。

我有2个对象,EmployeeCustomer,它们都有相应的表格。每个都包含一个地址列表。 Address类在两个对象之间共享,但位于两个单独的表EmployeeAddressCustomerAddress中。

EmployeeAddress - EmployeeId uniqueidentifier
                  Address varchar (50)
                  ZipCode varchar (10)
                  City varchar (20)
                  State id NOT NULL

CustomerAddress - CustomerId uniqueidentifier
                  Address varchar (50)
                  ZipCode varchar (10)
                  City varchar (20)
                  State id NOT NULL          

如何将Address对象映射到两个单独的表?我希望它能够在需要时从EmployeeAddressCustomerAddress表中提取数据。

我试过了:

(EmployeeMap)
HasMany(x => x.Addresses).Table("EmployeeAddress").KeyColumn("EmployeeId");

但是nHibernate抱怨Address类没有自己的映射类。

(AddressMap)
Id(x => x.Id);
Map(x => x.ParentItemId);  //generic way to reference EmployeeId or CustomerId
                           // but I can't specify which column name it should 
                           //  actually be using

但是nHIbernate尝试从Address表中抓取数据并且不存在,并且我的列名错误。

仅供参考:我将无法将两个地址表合并为一个。

1 个答案:

答案 0 :(得分:0)

您可以创建彼此继承的映射

包含所有重复值的基本映射类:

public class AddressBaseMap<T> : ClassMap<T> where T : Address
{
    public AddressBaseMap()
    {
        Map(x => x.Address);
        //etc
    }
}


public class CustomerAddressMap : AddressBaseMap<CustomerAddress>
{
    public CustomerAddressMap()
    {
        Table("CustomerAddress");
    }
}

我还建议使用组件,以便您可以将所有字段封装到一个类中。