概念的には次のようなクラス階層があります。
つまり、抽象基本クラス ( 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; }
}
コードによるマッピング ( ) を使用して、NHibernate の結合サブクラスを使用して、この階層を 4 つのテーブル ( Relation
、ContactPerson
、Customer
および)にマッピングしたいと考えています。私のマッピングは次のようになります。Supplier
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
ます。のマッピングがないため、これは失敗するか、もちろんです。"Name" プロパティ (で定義されている) もマッピングに表示されないことに注意してください。extends
BusinessContact
BusinessContact
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>
つまり、Relation を作成Supplier
して拡張し、(マップされていない)クラスCustomer
のすべてのマップされたプロパティを含めます。BusinessContact
どうすればこれを達成できますか?