2

概念的には次のようなクラス階層があります。

ここに画像の説明を入力

つまり、抽象基本クラス ( Relation) といくつかの派生クラスがあります。実際には、多くのコードCustomerSupplier共有するため、共通点を抽象クラスにリファクタリングしました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 つのテーブル ( RelationContactPersonCustomerおよび)にマッピングしたいと考えています。私のマッピングは次のようになります。SupplierModelMapper

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モデル内の「通常の」エンティティであるかのように、属性で定義SupplierBusinessContactます。のマッピングがないため、これは失敗するか、もちろんです。"Name" プロパティ (で定義されている) もマッピングに表示されないことに注意してください。extendsBusinessContactBusinessContactBusinessContact

マッピングを次のように表示したいのは次のとおりです。

<?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

どうすればこれを達成できますか?

4

1 に答える 1

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());
于 2013-03-20T19:14:30.340 に答える