在 NHibernate 中映射嵌套类的 XML 语法是啥

Posted

技术标签:

【中文标题】在 NHibernate 中映射嵌套类的 XML 语法是啥【英文标题】:What is the XML syntax for mapping a nested class in NHibernate在 NHibernate 中映射嵌套类的 XML 语法是什么 【发布时间】:2010-12-06 14:46:59 【问题描述】:

假设您有以下类定义:

public class SomeEntity

    public class Key
    
        public virtual OtherEntity Other  get; set; 
        public virtual int Index  get; set; 

        public override bool Equals(object other)
        
            // something here...
        

        public override int GetHashCode()
        
            // something here...
        
    

    public virtual Key Id  get; set; 


public class OtherEntity

    public virtual int Id  get; set; 

然后你想要一个类似于下面的映射文件:

<class name="SomeEntity" table="SOME">

  <composite-id name="Id" class="SomeEntity.Key">
    <key-many-to-one name="Other" column="OTHER_ID" class="OtherEntity" />
    <key-property name="Index" column="INDEX" type="int" />
  </composite-id>

</class>

<class name="OtherEntity" table="OTHER">

  <id name="Id" column="ID" type="int">
    <generator class="identity" />
  </id>

</class>

尝试初始化 NHibernate 会导致 NHibernate.MappingException 被抛出,并显示 “找不到类:SomeEntity.Key”的消息。很可能问题出在class="SomeEntity.Key" 属性上。我找不到引用嵌套类的正确语法。

我还想知道我应该在哪里寻找答案(例如,我在“NHibernate in Action”一书中找不到答案)。对于有关 NHibernate 的此类问题,您首选的资源是什么?

【问题讨论】:

【参考方案1】:

您必须对内部类使用 CLR 语法:

<composite-id name="Id" class="SomeEntity+Key">
...

【讨论】:

没错。所以我们为后代记录了它;)【参考方案2】:
public class MainClass

  public virtual long MainKey get; set;
  public virtual SubClass SubInstance get; set;

  public class SubClass
  
    public virtual long SubKey get;set;
  

可以映射为:

<class name="MainClass" table="Main">
  <id name="MainKey" column="MainId" type="Int64">
    <generator class="identity" />
  </id>
  <many-to-one name="SubInstance" class="MainClass+SubClass" Column="SubId"/> 
</class>

<class name="MainClass+SubClass" table="Sub">
  <id name="SubKey" column="SubId" type="Int64">
    <generator class="identity" />
  </id>
</class>

【讨论】:

以上是关于在 NHibernate 中映射嵌套类的 XML 语法是啥的主要内容,如果未能解决你的问题,请参考以下文章

Fluent 映射和 NHibernate Xml 配置

在没有 .hbm 或 xml 文件的 NHibernate Fluent 映射中定义命名查询

NHibernate生成实体类xml映射文件

如何使用 Fluent NHibernate 自动映射禁用特定抽象基类的子类化

nhibernate 怎么能够自动生成映射文件.hbm.xml 和数据库表 .cs 文件

如何在运行时从 nhibernate 映射文件生成实体类