次のシナリオでは、Fluent NHibernateを使用して型階層をデータベーススキーマにマップします。Fluent NHibernateでの継承マッピング
私はItem
とSubItem
クラスは抽象的であるNHibernateは2.0
型階層
public abstract class Item
{
public virtual int ItemId { get; set; }
public virtual string ItemType { get; set; }
public virtual string FieldA { get; set; }
}
public abstract class SubItem : Item
{
public virtual string FieldB { get; set; }
}
public class ConcreteItemX : SubItem
{
public virtual string FieldC { get; set; }
}
public class ConcreteItemY : Item
{
public virtual string FieldD { get; set; }
}
を使用しています。
データベーススキーマ
+----------+ +---------------+ +---------------+ | Item | | ConcreteItemX | | ConcreteItemY | +==========+ +===============+ +===============+ | ItemId | | ItemId | | ItemId | | ItemType | | FieldC | | FieldD | | FieldA | +---------------+ +---------------+ | FieldB | +----------+
ItemType
フィールドには、コンクリートの種類を決定します。
ConcreteItemX
テーブルの各レコードには、対応するレコードがItem
テーブルに1つあります。 ConcreteItemY
テーブルの場合も同様です。
FieldB
は、アイテムタイプがConcreteItemY
の場合は常にnullです。
マッピング(これまで)
public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
WithTable("Item");
Id(x => x.ItemId, "ItemId");
Map(x => x.FieldA, "FieldA");
JoinedSubClass<ConcreteItemX>("ItemId", MapConcreteItemX);
JoinedSubClass<ConcreteItemY>("ItemId", MapConcreteItemY);
}
private static void MapConcreteItemX(JoinedSubClassPart<ConcreteItemX> part)
{
part.WithTableName("ConcreteItemX");
part.Map(x => x.FieldC, "FieldC");
}
private static void MapConcreteItemY(JoinedSubClassPart<ConcreteItemY> part)
{
part.WithTableName("ConcreteItemX");
part.Map(x => x.FieldD, "FieldD");
}
}
FieldB
がマッピングされていません。
質問私は流暢NHibernateはを使用してSubItem
クラスのFieldB
プロパティをマッピングするにはどうすればよい
?
DiscriminateSubClassesOnColumn
には、ItemType
フィールドを使用する方法はありますか?
補遺
私はのhbm.xmlファイルを使用して所望の結果を達成することができる午前:
<class name="Item" table="Item">
<id name="ItemId" type="Int32" column="ItemId">
<generator class="native"/>
</id>
<discriminator column="ItemType" type="string"/>
<property name="FieldA" column="FieldA"/>
<subclass name="ConcreteItemX" discriminator-value="ConcreteItemX">
<!-- Note the FieldB mapping here -->
<property name="FieldB" column="FieldB"/>
<join table="ConcreteItemX">
<key column="ItemId"/>
<property name="FieldC" column="FieldC"/>
</join>
</subclass>
<subclass name="ConcreteItemY" discriminator-value="ConcreteItemY">
<join table="ConcreteItemY">
<key column="ItemId"/>
<property name="FieldD" column="FieldD"/>
</join>
</subclass>
</class>
は、どのように私は流暢NHibernateはを使用して上記のマッピングを達成するのですか?
Fluent NHibernateを使用して、クラスごとのテーブル階層とtable-per-subclassを混在させることはできますか?
これはコミュニティウィキとマークされている理由は何ですか?いずれにしても、使用しているマッピング戦略を明確にすることはできますか? JoinedSubClassPartは、サブクラスごとのパターンを意味しますが、具体的な項目がItemテーブルに保持されているとは、クラスあたりのテーブルのパターンを意味します。 –
コミュニティのwiki設定を変更する方法がわかりません。 FieldBを無視すると、table-per-subclassを使用できます。 FieldBの存在は私にいくつかの混乱を引き起こします。それは2つの戦略が混在しているようです。 ConcreteItemX型はSubItemからFieldBを継承します。 FieldBはItemテーブルに保持されます。 –