2008-11-25 118 views
8

我想映射使用Fluent NHibernate的联合子类场景。 我在命名空间中的核心定义的实体类和类 子类:实体命名空间中的SomeModule流利的NHibernate,加入 - 子类映射

现在我显然不希望实体类,以了解其派生 类型中,SomeModules命名空间引用的核心 - 没有其他方式 左右。

所有的例子我已经能够找到使用类似:

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

你好几天前做过类似的事情。

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); 
    }); 
} 
} 

希望它可以帮助

+1

您提出的解决方案不能解决我的问题,即分离实体和子类的映射。 – 2008-11-27 22:02:33

0

马格努斯,我有完全相同的类型的问题,和你的建议排序它。

JoinedSubClass的第二个参数需要针对SubT类型的对象的SubClassPart Action。因此,您只需要在子类对象上映射附加字段。

前面的例子是映射一个Id,所以我猜这是一个不同的ID基值和子类加入的值,否则你会开始看到SqlParameterCollection错误通过。

1

抱歉错过了你的评论,发现这个

public class SubClassMap : JoinedSubClassPart<SubClass> 
{ 
    public SubClassMap() 
     : base("SubClassId") 
    { 
     Map(x => x.Name); 
     Map(x => x.SomeProperty); 
    } 
} 

希望它可以帮助如果你还没有解决它了。

1

马格努斯(或奖品),

你弄清楚如何使用父映射类,最后一个例子?这为我工作,但我不喜欢实例化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 
+4

似乎添加零件现在已过时...? – 5x1llz 2009-06-01 13:36:56

10

我认为API已经改变,因为这个问题被问,但是这工作对我来说:

public class SomeSubclassMap : SubclassMap<SomeSubclass> { 
    public SomeSubclassMap() 
    { 
     KeyColumn("SomeKeyColumnID"); 
     Map(x => x.SomeSubClassProperty); 
     ... 
    } 
} 

我相信KeyColumn如果它比“Baseclassname_id”

不同时才需要

注意:SomeSubClass扩展的基类也应该有ClassMap<SomeBaseClass>

+0

+1您的不错的答案。你有什么想法如何告诉流利的NHibernate的“KeyColumn”应该加入到基类表中的列“XYZ”,而不是主键列? – 2011-05-20 16:46:23