试图实现User
和Role
之间相对简单的关系。 User
可以有多种角色,相同的Role
可以属于任何数量的User
s。 Role
s的共享,即,所有管理员User
s请参阅Role
类的非常相同的实例。另一个多到很多NHibernate的问题
User
映射:
<class name="User" lazy="false" table="Users">
<id name="Id" type="int">
<generator class="native"/>
</id>
<property name="Name" column="Username" />
<bag name="RoleList" table="User_Role" inverse="true" lazy="false" cascade="save-update">
<key column="UserId" foreign-key="Id"/>
<many-to-many class="Role" column="RoleId"/>
</bag>
</class>
Role
映射:
<class name="Role" lazy="false" table="Roles">
<id name="Id" type="int">
<generator class="native"/>
</id>
<property name="Name" column="Rolename"/>
<property name="Description"/>
</class>
有三种DB表:一个用于User
S,一个用于Role
s,并且第三个是用于许多对多关系(有两个外键:UserId
和RoleId
)。主键是这两个键的组合键。
的问题场景:角色是预定义的。在我的C#代码,我构建用户,而附加的作用它。该角色是一个成功从DB获取的对象,具有正确的ID。我正试图将用户保存在数据库中。
我们的问题:我收到一个重复键 DB错误,因为NHibernate的试图插入Role
对象插入到相应的表。由于RoleId
已经属于现有的角色,我预计在数据库中不会插入新角色。
血淋淋的细节:我也试着调试NHibernate和看到的,由于某种原因EntityIdentityInsertAction
收到Role
并调用基类的构造。在对基础构造函数的调用中,Id
参数是简单的硬编码null。堆栈跟踪还包含对SaveWithGeneratedId()
(链中较早的某个地方)的调用,这意味着由于某种原因,现有的Role
对象的Id
不计入。
这是我已经成功迄今发现的信息。请告诉我做错了什么。