Скажем, например, у меня есть следующее:
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 реализуют это.Или есть ли лучший способ добиться этого, чем методы, которые я перечислил выше?