2

假设您有以下类定义:

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被抛出,并显示"could not find class: SomeEntity.Key"消息。很可能问题出在class="SomeEntity.Key"属性上。我找不到引用嵌套类的正确语法。

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

4

2 回答 2

5

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

<composite-id name="Id" class="SomeEntity+Key">
...
于 2010-12-06T18:52:15.670 回答
3
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>
于 2012-09-10T14:34:50.023 回答