NHibernate: отображение таблицы на подкласс и новое ключевое слово - PullRequest
1 голос
/ 29 января 2010

Я пытаюсь использовать NHibernate для сопоставления таблицы по структуре наследования подкласса, которая выглядит примерно так:

public class BaseClass
{
    public virtual IColllection<BaseClassCollection> Collection { get; set; }
}

public class ChildClass : BaseClass
{
    public new virtual ICollection<ChildClassCollection> Collection { get; set; }
}

При попытке получить ChildClass из сеанса я получаю следующую ошибку:

"Невозможно привести объект типа 'NHibernate.Collection.Generic.PersistentGenericBag 1[BaseClassCollection]' to type 'System.Collections.Generic.ICollection 1 [ChildClassCollection]'."

Вот мой файл сопоставления:

<class name="BaseClass" table="BaseClassTable">
  <bag name="Collection">
    <key>
      <column name="BaseClassCollectionId" />
    </key>
    <one-to-many class="BaseClassCollection" />
  </bag>
  <joined-subclass name="ChildClass" table="ChildClassTable">
    <key>
      <column name="BaseClassId" />
    </key>
    <bag name="Collection">
      <key>
        <column name="ChildClassCollectionId" />
      </key>
      <one-to-many class="ChildClassCollection" />
  </bag>
</class>

Мне нужен какой-то способ переопределения типа свойства Collection в базовом классе, когда я сопоставляю дочерний класс. Возможно ли это с NHibernate?

1 Ответ

1 голос
/ 04 июня 2010

Я думаю, что единственный способ заставить это работать - это сделать что-то вроде:

public class BaseClass<TChild> where TChild : BaseClassCollection {
    public virtual ICollection<TChild> Collection { get; set; }
}

public class ChildClass<TChild> : BaseClass<TChild> where TChild : ChildClassCollection {
    public override ICollection<TChild> Collection { get; set; }
}

public class BaseClassCollection { }
public class ChildClassCollection : BaseClassCollection { }

Проблема в том, что ключевое слово new нарушает наследование, и тогда ваше отображение полагается на это наследование. Вы действительно должны избегать использования new в любом месте, потому что это не очень хорошая идея; возьмите NHibernate из смеси, и вы получите различное поведение в зависимости от того, как вы сыграете свой класс; разыграйте его как BaseClass, и вы получите нечто совершенно иное, чем если бы вы раздали его как ChildClass.

Если это не тот ответ, который вы ищете, я прошу прощения, но я не думаю, что можно заставить его работать, если вам нужно использовать ключевое слово new.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...