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 в свою коллекцию (также устанавливая свойство Company объекта IEmployee для создания двунаправленных отношений). Затем, когда я сохраняю компанию, все происходит в базе данных, как и ожидалось. Компания верно настроена на записи 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

Ничего общего с объединением-подклассом в конце. Проблема заключалась в коллекции «один ко многим», которую я указал в столбце = «CompanyId», а во многих случаях я указал столбец = «CompanyId». Включение backticks в один, а не в другой, вызвало NHibernate, чтобы думать, что они были другой колонкой. Никогда не сталкивайтесь с этим за все время, используя NHibernate.