2011-09-03 41 views
0

我已经继承了一个Spring + NHibernate的c#应用程序,我们正在进行一次大规模的彻底检查(而且我对NHibernate相当新颖)。在数据库中设置的用户/角色不是最佳的,所以我正在重写它,因为无论如何,该项目的一部分都是添加新功能。但是,NHibernate的翻译工作不正常。这里是我的设置的相关部分:休眠多对多映射在插入时无法正常工作

数据库: 3桌;用户,角色和USERS_XREF_ROLES(这是加入/网桥表)

User.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> 

UserRole.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> 

还要注意,有WASN” t最初是UserRole类中的一组“用户”;我已经添加了它,因为添加了桥/连接表和SO上的另一篇文章,其中提到使用桥/连接表的反向集。所有的SELECT都工作正常。我经历了多个用户并测试了他们应该拥有的权限。但是,当我试图创建一个新用户时,显然也试图插入到ROLES中:

错误:Hibernate操作:无法插入:[UserRole] [SQL:INSERT INTO [ROLES]([VALUE] )VALUES(?);选择SCOPE_IDENTITY()];未分类DataException for SQL [INSERT INTO [ROLES]([VALUE])VALUES(?);选择SCOPE_IDENTITY()];错误代码 [];无法将NULL值插入'NAME'列'ROLES'列;列不允许有空值。 INSERT失败。该语句已终止。

新用户显然应该在USERS和USERS_XREF_ROLES中生成一个INSERT,但不是ROLES。那么,我在这里做错了什么?谢谢。

更新:我试图让我的问题更清晰。我最大的问题是,我发现的所有示例都显示将相关对象的BOTH插入到每个相应的表中和连接表中。我希望能够添加具有现有角色的用户。创建用户时,我不希望在ROLES表中出现插入。创建用户应该总是将一条记录插入到USERS中,并将一条或多条记录插入到USERS_XREF_ROLES中,但不要将其插入到ROLES中,因为用户将始终被分配到现有角色。我希望这更清楚。我还没有找到一个能够证明这一点的例子,这一定是一件很常见的事情。

回答

0

A new user should obviously generate an INSERT into USERS and USERS_XREF_ROLES, but NOT ROLES. So, what am I doing incorrectly here? Thanks.

这种说法混淆了我,我可能只是误会,但如果USERS_XREF_ROLES是桥台那么为什么一个INSERT到USERS必要插入到表桥?用户可能存在没有分配的角色吗?考虑到这一点,我认为问题不在于nHibernate映射,而在于你的c#对象被实例化的方式。也许一个未绑定的Role类是通过User类的实例创建的?

+0

你是对的 - USERS表中没有对应记录的记录可以存在于USERS_XREF_ROLES表中。但是,业务要求是所有用户必须分配至少一个角色。我的假设是NHibernate处理所有插入逻辑,并且它都可以通过XML进行配置。我没有桥表的类(这是正确的处理?),那么如何确保将记录插入到USERS和USERS_XREF_ROLES中?我认为这真的是我在这里不理解的。 – heath

+0

我不知道这样的需求可以由nHibernate强制执行,因为它必须知道某个默认角色才能分配给用户。我的建议是,您的数据模型会在您的C#代码中执行任何此类要求。数据库触发器也可以工作,但我对此有个人偏好。 –

+0

是的,没有db触发我,无论。那么,你所说的是,如果我按照我设置的方式声明cascade =“all”,它会尝试在所有3个表中插入一条记录?这似乎是一个非常普遍的情况,这让我觉得应该有一个非常普遍的,直接的解决方案。但是,我真的没有通过谷歌找到很多。由于我正在改写这个,所以我很乐意接受不同的解决方案。 – heath