0

看看下面的實體:加載工會子類實體的集合多態 - 列指定了多次

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> 

如果我創建了一個公司實體並將IEmployee實體添加到其集合中(同時設置IEmployee實體的Company屬性以創建雙向關係),然後當我保存公司時,所有內容都按預期進入數據庫。 companyId在PoductionEmployee和SalesEmlpoyee記錄上正確設置。

但是,當我來到加載它,我得到以下錯誤:

列「CompanyId」被多次指定爲「employees0_」

生成的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列,我該如何防止這種情況?

回答

0

最終與union-subclass無關。問題出在我指定column =「CompanyId」的一對多集合中,並且在我指定column =「`CompanyId`」的多對一集合中。將反引號包含在一個而不是另一個引起NHibernate認爲他們是不同的列。從來沒有在我所有的時間使用NHibernate。

相關問題