2

TL;DR 版本:下面的代码在构建 SessionFactory 时给了我一个“关联引用未映射的类”异常。应该在代码中更改什么来修复它?


尽管 Ayende @ Rahien 不建议在2007 年的这篇文章中使用泛型类的映射,但我仍然尝试了一下。我使用了他提到的方法。首先工作的位:

<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 时以异常结束:

关联引用未映射的类: ....在此处插入一对多.class ....

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

4

1 回答 1

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>

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

于 2012-09-22T20:43:08.763 回答