у меня есть иерархия классов, которая концептуально выглядит примерно так:Регистрация подклассов унаследовавших от неотображенных, абстрактных промежуточных классов
То есть, есть абстрактный базовый класс (Relation
) и пара производные классы. На практике Customer
и Supplier
делят много кода, поэтому я реорганизовал общности в абстрактный класс BusinessContact
. Теперь фактическая иерархия классов выглядит следующим образом:
Или в коде:
public abstract class Relation
{
public virtual int Id { get; set; }
}
public class ContactPerson : Relation
{
public virtual string PhoneNumber { get; set; }
}
public abstract class BusinessContact : Relation
{
public virtual string Name { get; set; }
}
public class Customer : BusinessContact
{
public virtual string CustomerNumber { get; set; }
}
public class Supplier : BusinessContact
{
public virtual string SupplierNumber { get; set; }
}
я хотел бы отобразить эту иерархию четырех таблиц (Relation
, ContactPerson
, Customer
и Supplier
) с использованием join-subclasses в NHibernate, используя сопоставление по коду (ModelMapper
). Мое отображение выглядит следующим образом:
var mapper = new ModelMapper();
mapper.Class<Relation>(map =>
{
map.Id(x => x.Id, id => id.Generator(Generators.Native));
});
mapper.JoinedSubclass<ContactPerson>(map =>
{
map.Key(key => key.Column("Id"));
map.Property(x => x.PhoneNumber);
});
mapper.JoinedSubclass<Customer>(map =>
{
map.Key(key => key.Column("Id"));
map.Property(x => x.Name);
map.Property(x => x.CustomerNumber);
});
mapper.JoinedSubclass<Supplier>(map =>
{
map.Key(key => key.Column("Id"));
map.Property(x => x.Name);
map.Property(x => x.SupplierNumber);
});
Однако, как только я пытаюсь добавить отображение в конфигурации я получаю исключение:
NHibernate.MappingException: Cannot extend unmapped class: BusinessContact
Я в принципе понимаю, почему это происходит. Сформированное отображение выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" namespace="JoinedSubClassMapping" assembly="JoinedSubClassMapping" xmlns="urn:nhib ernate-mapping-2.2">
<class name="Relation" abstract="true">
<id name="Id" type="Int32">
<generator class="native" />
</id>
</class>
<joined-subclass name="ContactPerson" extends="Relation">
<key column="Id" />
<property name="PhoneNumber" />
</joined-subclass>
<joined-subclass name="Customer" extends="BusinessContact">
<key column="Id" />
<property name="CustomerNumber" />
</joined-subclass>
<joined-subclass name="Supplier" extends="BusinessContact">
<key column="Id" />
<property name="SupplierNumber" />
</joined-subclass>
</hibernate-mapping>
Customer
и Supplier
определяют BusinessContact
в их атрибут extends
, как если бы BusinessContact
был «нормальный» сущность в модели. Поскольку нет отображения для BusinessContact
, это терпит неудачу или курс. . Заметим, что свойство «Name» (определено в BusinessContact
не появляется в отображении либо
Что я хочу отображение выглядеть так:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" namespace="JoinedSubClassMapping" assembly="JoinedSubClassMapping" xmlns="urn:nhibernate-mapping-2.2">
<class name="Relation" abstract="true">
<id name="Id" type="Int32">
<generator class="native" />
</id>
</class>
<joined-subclass name="ContactPerson" extends="Relation">
<key column="Id" />
<property name="PhoneNumber" />
</joined-subclass>
<joined-subclass name="Customer" extends="Relation">
<key column="Id" />
<property name="CustomerNumber" />
<property name="Name" />
</joined-subclass>
<joined-subclass name="Supplier" extends="Relation">
<key column="Id" />
<property name="SupplierNumber" />
<property name="Name" />
</joined-subclass>
</hibernate-mapping>
То есть, сделать Supplier
и Customer
расширить Relation и включают в себя все отображенные свойства (в противном случае некартированного) BusinessContact
класса.
Как я могу добиться этого?
Большое спасибо, что делает трюк. До сих пор я не знал о «IModelInspector». Думаю, я создам атрибут и попрошу инспектора модели искать его для повторного использования. –