以多态方式加载union-subclass实体的集合 - 多次指定列

时间:2013-06-24 10:12:54

标签: nhibernate inheritance collections polymorphism union-subclass

采取以下实体:

public class Company : Entity<Guid>
{
    public virtual string Name { get; set; }
    public virtual IList<IEmployee> Employees { get; set; }

    public Company()
    {
        Id = Guid.NewGuid();
        Employees = new List<IEmployee>();
    }
}

public interface IEmployee
{
    Guid? Id { get; set; }
    string Name { get; set; }
    void Work();
    Company Company { get; set; }
}

public class ProductionEmployee : Entity<Guid>, IEmployee
{
    public virtual string Name { get; set; }
    public virtual Company Company { get; set; }

    public ProductionEmployee()
    {
        Id = Guid.NewGuid();
    }

    public virtual void Work()
    {
        Console.WriteLine("I'm making the stuff.");
    }
}

public class SalesEmployee : Entity<Guid>, IEmployee
{
    public virtual string Name { get; set; }
    public virtual Company Company { get; set; }

    public SalesEmployee()
    {
        Id = Guid.NewGuid();
    }

    public virtual void Work()
    {
        Console.WriteLine("I'm selling the stuff.");
    }
}

在NHibernate中以下列方式映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="PolymorphicUnionSubclass.Domain.Entities"
               assembly="PolymorphicUnionSubclass.Domain">
  <class name="Company" table="`Company`">
    <id name="Id" column="Id" type="guid">
      <generator class="assigned"/>
    </id>
    <property name="Name" column="`Name`"/>

    <bag name="Employees" inverse="true" cascade="save-update">
      <key column="CompanyId"></key>
      <one-to-many class="IEmployee" />
    </bag>
  </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               namespace="PolymorphicUnionSubclass.Domain.Entities"
               assembly="PolymorphicUnionSubclass.Domain">
  <class name="IEmployee" abstract="true">
    <id name="Id" column="Id" type="guid">
      <generator class="assigned"/>
    </id>

    <many-to-one name="Company" column="`CompanyId`" cascade="save-update"/>

    <union-subclass name="ProductionEmployee" table ="`ProductionEmployee`" >
    </union-subclass>

    <union-subclass name="SalesEmployee" table ="`SalesEmployee`">
    </union-subclass>

  </class>
</hibernate-mapping>

如果我创建一个Company实体并将IEmployee实体添加到其集合中(还设置了IEmployee实体的Company属性以创建双向关系),那么当我保存公司时,所有内容都按预期进入数据库。 companyId在PoductionEmployee和SalesEmlpoyee记录上正确设置。

但是当我加载它时,我收到以下错误:

'employees0 _'

多次指定了'CompanyId'列

生成的SQL如下所示:

SELECT employees0_.CompanyId as CompanyId1_, employees0_.Id as Id1_, employees0_.Id as Id9_0_, employees0_.[CompanyId] as CompanyId2_9_0_, employees0_.clazz_ as clazz_0_ 
FROM ( select Id, CompanyId, CompanyId, 1 as clazz_ from [ProductionEmployee] union all select Id, CompanyId, CompanyId, 2 as clazz_ from [SalesEmployee] ) employees0_ 
WHERE employees0_.CompanyId=?

为什么它会两次生成CopmanyId列,如何防止这种情况?

1 个答案:

答案 0 :(得分:0)

最后与union-subclass无关。问题出在我指定了column =“CompanyId”的一对多集合中,并且在多对一中我指定了column =“`CompanyId`”。将反引号包含在一个而不是另一个中导致NHibernate认为它们是不同的列。在我使用NHibernate的所有时间里都没有遇到过这种情况。