我正在尝试使用Fluent NHibernate映射一个连接子类场景。 我在命名空间Core中定义了一个类Entity,以及一个类 SubClass:名称空间SomeModule
中的实体现在我显然不希望类Entity知道它的派生 类型,SomeModules命名空间引用Core - 而不是其他方式 周围。
我能找到的所有例子都使用了:
public class EntityMap : ClassMap<Entity> {
public EntityMap() {
Id(x => x.Id)
var subClassMap = JoinedSubClass<SubClass>("SubClassId", sub => sub.Map(x => x.Id));
subClassMap.Map(x => x.SomeProperty)
...
}
}
这根本不适用于我的情况 - 我需要类似的东西 NHibernate xml映射:
<joined-subclass name="SubClass" extends="Entity, Core" >
<key column="SubClassId" foreign-key="FK_KollegiumEntity"/>
<property name="Name" length="255" not-null="true" />
...
</joined-subclass>
有没有人用Fluent NHibernate实现这个目标?
答案 0 :(得分:10)
我认为自从提出这个问题以来API已经发生了变化,但这对我有用:
public class SomeSubclassMap : SubclassMap<SomeSubclass> {
public SomeSubclassMap()
{
KeyColumn("SomeKeyColumnID");
Map(x => x.SomeSubClassProperty);
...
}
}
我认为KeyColumn仅在与'Baseclassname_id'不同时才需要
注意:SomeSubClass扩展的基类也应该有ClassMap<SomeBaseClass>
。
答案 1 :(得分:1)
抱歉错过了你的评论,发现了这个
public class SubClassMap : JoinedSubClassPart< SubClass >
{
public SubClassMap()
: base("SubClassId")
{
Map(x => x.Name);
Map(x => x.SomeProperty);
}
}
如果你还没有解决它,希望它有所帮助。
答案 2 :(得分:1)
Magnus(或Prize),
您是否弄清楚如何在父映射类中使用最后一个示例?这对我有用,但我不喜欢自己实例化SubClassMap:
public class EntityMap : ClassMap<Entity> {
public EntityMap() {
Id(x => x.Id)
AddPart(new SubClassMap()); // Adds the subclass mapping!
}
}
public class SubClassMap : JoinedSubClassPart<SubClass>
{
public SubClassMap()
: base("SubClassId")
{
Map(x => x.Name);
Map(x => x.SomeProperty);
}
}
其中产生的查询类似于:
SELECT
this_.Id as Id2_2
this_.Name as Name3_2
this_.SomeProperty as SomeProperty3_2
FROM
SubClass this_ inner join
Entity this_1 on this_.Id=this_1.Id
答案 3 :(得分:0)
你好几天前做过类似的事。
public class EntityMap : ClassMap<Entity> {
public EntityMap() {
Id(x => x.Id)
JoinedSubClass<SubClass>("SubClassId", sub => {
sub.Map(x => x.Name);
sub.Map(x => x.SomeProperty);
});
}
}
希望有所帮助
答案 4 :(得分:0)
Magnus,我遇到了完全相同类型的问题,你的建议对它进行了排序。
JoinedSubClass的第二个参数对SubT类型的对象采用SubClassPart Action。因此,您只需要在子类对象上映射其他字段。
前面的例子是映射一个Id,所以我猜这是与基类和子类连接的值不同的id,否则你会开始看到SqlParameterCollection错误正在通过。