Свободный NHibernate - подклассы с общей ссылкой - PullRequest
2 голосов
/ 05 февраля 2010

Редактировать: изменены имена классов.

Я использую автоматическое отображение Fluent NHibernate (v 1.0.0.614) для следующего набора классов (где Entity - это базовый класс, предоставляемый в инфраструктуре S # arp Architecture):

public class Car : Entity
{
    public virtual int ModelYear { get; set; }
    public virtual Company Manufacturer { get; set; }
}

public class Sedan : Car
{
    public virtual bool WonSedanOfYear { get; set; }
}

public class Company : Entity
{
    public virtual IList<Sedan> Sedans { get; set; }
}

Это приводит к следующей конфигурации (как записано в hbm.xml):

   <class name="Company" table="Companies">
     <id name="Id" type="System.Int32" unsaved-value="0">
       <column name="`ID`" />
       <generator class="identity" />
     </id>
     <bag cascade="all" inverse="true" name="Sedans" mutable="true">
       <key>
           <column name="`CompanyID`" />
       </key>
       <one-to-many class="Sedan" />
     </bag>
   </class>

   <class name="Car" table="Cars">
     <id name="Id" type="System.Int32" unsaved-value="0">
       <column name="`ID`" />
       <generator class="identity" />
     </id>
     <property name="ModelYear" type="System.Int32">
       <column name="`ModelYear`" />
     </property>
     <many-to-one cascade="save-update" class="Company" name="Manufacturer">
       <column name="`CompanyID`" />
     </many-to-one>
     <joined-subclass name="Sedan">
       <key>
          <column name="`CarID`" />
       </key>
       <property name="WonSedanOfYear" type="System.Boolean">
          <column name="`WonSedanOfYear`" />
       </property>
     </joined-subclass>
   </class>

Пока все хорошо! Но теперь наступает ужасная часть. Сгенерированные таблицы базы данных:

Table: Companies
Columns: ID (PK, int, not null)

Table: Cars
Columns: ID (PK, int, not null)
         ModelYear (int, null)
         CompanyID (FK, int, null)


Table: Sedan
Columns: CarID (PK, FK, int, not null)
         WonSedanOfYear (bit, null)
         CompanyID (FK, int, null)

Вместо одного ФК для Компании я получаю два!

Как я могу гарантировать, что я получу только один ФК для Компании? Переопределить автоматическое сопоставление? Поставить конвенцию на место? Или это ошибка? Ваши мысли ценятся.

1 Ответ

0 голосов
/ 27 марта 2010

Я чувствую твою боль.

В этот момент я сделал следующее, потому что у меня не хватало времени

public class JoinedSubclassConvention : IJoinedSubclassConvention
{
    public void Apply(IJoinedSubclassInstance instance)
    {
        switch (instance.EntityType.Name)
        {
            case "Business":
                instance.Key.ForeignKey("FK_Business_Customer");
                break;
            case "Person":
                instance.Key.ForeignKey("FK_Person_Customer");
                break;
            case "StaffMember":
                instance.Key.ForeignKey("FK_StaffMember_Customer");
                break;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...