流畅的NHibernate,连接子类映射

时间:2008-11-25 16:54:08

标签: c# .net nhibernate fluent-nhibernate orm

我正在尝试使用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实现这个目标?

5 个答案:

答案 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错误正在通过。

相关问题