2013-03-19 3 views
2

у меня есть иерархия классов, которая концептуально выглядит примерно так:Регистрация подклассов унаследовавших от неотображенных, абстрактных промежуточных классов

enter image description here

То есть, есть абстрактный базовый класс (Relation) и пара производные классы. На практике Customer и Supplier делят много кода, поэтому я реорганизовал общности в абстрактный класс BusinessContact. Теперь фактическая иерархия классов выглядит следующим образом:

enter image description here

Или в коде:

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 класса.

Как я могу добиться этого?

ответ

2

Вот решение:

class MyInspector : ExplicitlyDeclaredModel { 
    public override bool IsEntity(Type type) { 
     if (type == typeof (BusinessContact)) 
      return false; 
     return base.IsEntity(type); 
    } 
} 

var mapper = new ModelMapper(new MyInspector()); 
+0

Большое спасибо, что делает трюк. До сих пор я не знал о «IModelInspector». Думаю, я создам атрибут и попрошу инспектора модели искать его для повторного использования. –