【发布时间】:2011-09-03 18:22:00
【问题描述】:
我继承了一个 Spring+NHibernate c# 应用程序,我们正在对它进行大修(而且我对 NHibernate 还很陌生)。数据库中设置的用户/角色不是最佳的,所以我正在重写它,因为项目的一部分无论如何都在添加新功能。但是,翻译成 NHibernate 的工作不正常。这是我设置的相关部分:
数据库: 3张桌子; USERS、ROLES 和 USERS_XREF_ROLES(即连接/桥接表)
用户.hbm.xml:
<set name="Roles" table="[USERS_XREF_ROLES]" lazy="false" order-by="[FK_ROLES] asc" cascade="all">
<key column="[FK_USERS]" />
<many-to-many class="UserRole" column="[FK_ROLES]" />
</set>
用户角色.hbm.xml:
<set name="Users" inverse="true" table="[USERS_XREF_ROLES]" lazy="false" >
<key column="[FK_ROLES]" />
<many-to-many class="User" column="[FK_USERS]" />
</set>
另请注意,UserRole 类中最初没有设置“用户”;我添加了它是因为添加了桥接/连接表和 SO 上的另一篇文章,其中提到使用桥接/连接表的反向集。所有 SELECT 都工作正常。我检查了多个用户并测试了他们应该拥有的权限。但是,当我尝试创建一个新用户时,它显然也在尝试插入 ROLES:
错误:休眠操作:无法插入:[UserRole][SQL: INSERT INTO [ROLES] ([VALUE]) VALUES (?);选择 SCOPE_IDENTITY()]; SQL [INSERT INTO [ROLES] ([VALUE]) VALUES (?) 的未分类 DataException;选择 SCOPE_IDENTITY()];错误代码 [];无法将值 NULL 插入到列 'NAME'、表 'ROLES' 中;列不允许空值。插入失败。该语句已终止。
一个新用户显然应该在 USERS 和 USERS_XREF_ROLES 中生成一个 INSERT,而不是 ROLES。那么,我在这里做错了什么?谢谢。
更新:我试图让我的问题更清楚。我的大问题是,我发现的所有示例都显示将两个相关对象插入每个相应的表和连接表中。我希望能够添加具有现有角色的用户。创建用户时,我不希望在 ROLES 表中发生插入。创建用户时应始终将一条记录插入 USERS,将一条或多条记录插入 USERS_XREF_ROLES,但永远不要插入 ROLES,因为用户将始终被分配到现有角色。我希望这更清楚。我还没有找到一个例子来说明这一点,这一定是一件很常见的事情。
【问题讨论】:
标签: c# .net sql nhibernate