一对一和泛型:“关联引用未映射的类”

时间:2012-09-22 19:36:56

标签: c# nhibernate nhibernate-mapping

TL; DR版本:在构建SessionFactory时,下面的代码为我提供了“ Association引用未映射的类”异常。应该在代码中修改什么来修复它?


即使Ayende @ Rahien不建议在this 2007 article中使用映射到泛型类,我仍然可以使用它。我用他提到的方法。首先是 工作的位:

<class name="Review`1[Person]" table="Review">
  <id name="Id" column="ReviewId"><generator class="native" /></id>
  <property name="Rating" />
  <many-to-one name="Subject" column="PersonId" class="Person" />
</class>

相应的泛型类如下所示:

public class Review<T> : BaseEntity where T : IReviewable
{
    public virtual int Rating { get; set; }
    public virtual T Subject { get; set; }
}

这是有效的,我可以加载这些Review实体并在我的MVC视图中显示它们没问题。好的部分是当我在控制器和视图中使用它时,我的Subject将具有正确的类型。


然而,当我尝试在Person类上映射一组Review项时,事情开始崩溃。这是我目前正在使用的映射:

<class name="Person">
  <!-- abbreviated -->
  <bag name="Reviews" table="Review">
    <key column="PersonId"/>
    <one-to-many class="Review`1[Person]" />
    <!-- Also tried these:
    <one-to-many class="table="Review"> 
    ... plus a few variations with fully qualified names ...
    -->
  </bag>
</class>

使用此(缩写)类:

public class Person : BaseEntity, IReviewable
{
    /* Abbreviated */
    public virtual IList<Review<Person>> Reviews { get; set; }
}

这在构建SessionFactory时以异常结束:

  

关联引用未映射的类:....在这里插入one-to-many.class ....

所以问题:这里有什么问题?这甚至可能吗?我是否应该放弃映射通用实体?

1 个答案:

答案 0 :(得分:1)

按代码映射为我生成了这个:

<class name="NHTest.Review`1[[NHTest.Person, NHTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]" table="Review">
  ...
  <many-to-one name="Subject" column="..." />
</class>
<class name="Person">
  ...
  <bag name="Reviews">
    <key column="..." />
    <one-to-many class="NHTest.Review`1[[NHTest.Person, NHTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]" />
  </bag>
</class>

因此,请尝试使用完全限定名称。