Отображение коллекции интерфейсов в NHibernate / Hibernate - PullRequest
1 голос
/ 25 июля 2011

Скажем, например, у меня есть следующее:

public interface IPet
{
    long? Id { get; set; }
    string Name { get; set; }
}

public class Cat : IPet
{
    public virtual long? Id { get; set; }
    public virtual string Name { get; set; }
}

public class Dog : IPet
{
    public virtual long? Id { get; set; }
    public virtual string Name { get; set; }
}

И следующие сопоставления:

<class name="Cat" table="`Cat`" >
  <id name="Id" type="long">
    <generator class="identity"/>
  </id>
  <property name="Name"/>
</class>

<class name="Dog" table="`Dog`" >
  <id name="Id" type="long">
    <generator class="identity"/>
  </id>
  <property name="Name"/>
</class>

Теперь, когда я делаю следующее:

IList<IPet> pets = session.CreateCriteria<IPet>().List<IPet>();

Из-за скрытого полиморфизма, приятной функции, он возвращает всех кошек и собак.Теперь рассмотрим это:

public class PetShop
{
    public long? Id { get; set; }
    public List<IPet> Pets { get; set; }
}

<class name="PetShop" table="`PetShop`" >
  <id name="Id" type="long">
    <generator class="identity"/>
  </id>
  <property name="Name"/>
  <bag name="Pets"  cascade="all">
    <key column="PetShopId"/>
    <one-to-many class="IPet"/>
  </bag>
</class>

Я надеялся, что это будет означать, что коллекция домашних животных будет использовать неявный полиморфизм для заполнения коллекции, но вместо этого я получаю сообщение об ошибке 'Связи ссылается на не отображенный класс: IntefaceCollectionExample.Domain.Entities.МГЭ.Я мог бы создать карту и таблицу для IPet, в которую включен только Id, но это кажется не интуитивным.Я мог бы использовать union-subclass, но тогда потерял бы возможность использовать генератор class = "identity".Я мог бы использовать многие к любому, но я чувствую, что это было бы довольно неуклюже в этом случае.

Есть что-то, что я пропускаю?Есть ли способ создать сопоставление для интерфейса для IPet, но не нужна таблица, а затем указать, что Cat и Dog реализуют это.Или есть ли лучший способ добиться этого, чем методы, которые я перечислил выше?

1 Ответ

1 голос
/ 25 июля 2011

Неявный полиморфизм не поддерживается для one-to-many сценариев

Вы можете использовать явную стратегию наследования (т. Е. Всю иерархию необходимо отобразить, начиная с интерфейса), или создать таблицу для коллекции и отобразить как many-to-any.

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