gpt4 book ai didi

nhibernate - 使用 Fluent NHibernate 进行继承映射

转载 作者:行者123 更新时间:2023-12-02 20:50:28 24 4
gpt4 key购买 nike

考虑到以下场景,我想使用 Fluent NHibernate 将类型层次结构映射到数据库架构。

我正在使用 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; }
}

See image

ItemSubItem 类是抽象的。

<小时/>

数据库架构

+----------+  +---------------+  +---------------+| Item     |  | ConcreteItemX |  | ConcreteItemY |+==========+  +===============+  +===============+| ItemId   |  | ItemId        |  | ItemId        || ItemType |  | FieldC        |  | FieldD        || FieldA   |  +---------------+  +---------------+| FieldB   |+----------+

See image

The ItemType field determines the concrete type.

Each record in the ConcreteItemX table has a single corresponding record in the Item table; likewise for the ConcreteItemY table.

FieldB is always null if the item type is ConcreteItemY.


The Mapping (so far)

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 未映射。

<小时/>

问题

如何使用 Fluent NHibernate 映射 SubItem 类的 FieldB 属性?

有什么方法可以利用 ItemType 字段来利用 DiscriminateSubClassesOnColumn 吗?

<小时/>

附录

我能够使用 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>

如何使用 Fluent NHibernate 完成上述映射?

是否可以使用 Fluent NHibernate 将每个类层次结构表与每个子类表混合?

最佳答案

我知道这确实很旧,但现在设置 Fluent 来生成您最初想要的精确映射非常简单。由于我在寻找答案时发现了这篇文章,所以我想我应该发布它。

您只需为基类创建 ClassMap,而不引用子类:

public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
this.Table("Item");
this.DiscriminateSubClassesOnColumn("ItemType");
this.Id(x => x.ItemId, "ItemId");
this.Map(x => x.FieldA, "FieldA");
}
}

然后像这样映射你的抽象子类:

public class SubItemMap: SubclassMap<SubItemMap>
{
public SubItemMap()
{
this.Map(x => x.FieldB);
}
}

然后像这样映射您的具体子类:

public class ConcreteItemXMap : SubclassMap<ConcreteItemX>
{
public ConcretItemXMap()
{
this.Join("ConcreteItemX", x =>
{
x.KeyColumn("ItemID");
x.Map("FieldC")
});
}
}

希望这可以帮助其他人寻找这种类型的流利映射。

关于nhibernate - 使用 Fluent NHibernate 进行继承映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com