NHibernate单表继承

NHibernate单表继承,nhibernate,hibernate,nhibernate-mapping,Nhibernate,Hibernate,Nhibernate Mapping,我无法使用继承和NHibernate设置基于角色的结构 基本上我想要一个名为ObjectInRole的抽象类。这个类(和相应的数据库表)包含一个RoleId、一个ObjectId和一个ObjectType(这将是discriminator列)。鉴别器列将是获得角色的对象类型 为了简单起见,假设存在一个包含角色列表(包)的用户对象。我希望它能让我有一个UserInRole类,它是ObjectInRole的一个子类 我创造了这样一个包: <bag name="Roles" table="Obj

我无法使用继承和NHibernate设置基于角色的结构

基本上我想要一个名为ObjectInRole的抽象类。这个类(和相应的数据库表)包含一个RoleId、一个ObjectId和一个ObjectType(这将是discriminator列)。鉴别器列将是获得角色的对象类型

为了简单起见,假设存在一个包含角色列表(包)的用户对象。我希望它能让我有一个UserInRole类,它是ObjectInRole的一个子类

我创造了这样一个包:

<bag name="Roles" table="ObjectInRole" where="ObjectType = 'AthletesCafe.Core.Domain.System.Users.User, AthletesCafe.Core'" generic="true"
     access="field.pascalcase-underscore" lazy="true">
  <key column="ObjectId" />
  <many-to-many class="AthletesCafe.Core.Domain.System.Roles.Role, AthletesCafe.Core" column="RoleId" />
</bag>

如果查看上面的类,我已经设置了User对象和Role对象。id是一个标识字段,因此被指定。我完全不知所措。

好的!在反复使用映射文件之后,我发现了一个未记录的问题(至少我找不到我正在提交的错误)

使用子类化时,父类不能包含作为鉴别器列的属性的映射。如果您查看我发布的第二个映射文档,它显示了超类和子类。超类的鉴别器是ObjectType列。我还将其作为属性映射到抽象类ObjectInRole。你不能这样做。一旦这条线被移除,一切都正常工作(不保存袋子)

这个包似乎是一个无法通过我在文档中找到的任何东西控制的问题。我找不到通过映射保存抽象类的另一个实例。NHibernate似乎不知道链接类是UserInRole对象而不是ObjectInRole对象。通过研究为bag节点提供的所有选项,没有明显的方法来告诉NHibernate它通过什么类型的类来建立多对多关联。据我所知,这并不重要,但或多或少地将表视为一个表,而不是一个映射对象。如果有一种方法可以告诉它为insert添加一些东西,那么也许这是可能的,但是我没有看到任何关于这方面的信息

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="AthletesCafe.Core.Domain.System.Roles" assembly="AthletesCafe.Core">
  <class name="ObjectInRole" table="ObjectInRole" lazy="true" abstract="true">
<id name="ID" type="Int32" unsaved-value="0">
  <column name="ID" not-null="true" unique="true" index="PK_ObjectInRole"/>
  <generator class="identity" />
</id>
<discriminator column="ObjectType" type="String" insert="true" force="true"/>
<property name="ApplicationName" column="ApplicationName" type="String" not-null="false" length="255" />
<property name="ObjectId" column="ObjectId" type="int" not-null="true" />
<property name="ObjectType" column="ObjectType" type="String" />

<many-to-one name="Role" column="RoleId" class="AthletesCafe.Core.Domain.System.Roles.Role, AthletesCafe.Core" not-null="true" cascade="none" />

<subclass name="AthletesCafe.Core.Domain.System.Roles.UserInRole" 
          discriminator-value="AthletesCafe.Core.Domain.System.Users.User, AthletesCafe.Core">
  <many-to-one name="User" column="ObjectId" class="AthletesCafe.Core.Domain.System.Users.User, AthletesCafe.Core" not-null="false" cascade="none" />
</subclass>
null id in AthletesCafe.Core.Domain.System.Roles.UserInRole entry (don't flush the Session after an exception occurs)