2010-06-28 47 views
0

试图实现UserRole之间相对简单的关系。 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,并且第三个是用于许多对多关系(有两个外键:UserIdRoleId)。主键是这两个键的组合键。

的问题场景:角色是预定义的。在我的C#代码,我构建用户,而附加的作用它。该角色是一个成功从DB获取的对象,具有正确的ID。我正试图将用户保存在数据库中。

我们的问题:我收到一个重复键 DB错误,因为NHibernate的试图插入Role对象插入到相应的表。由于RoleId已经属于现有的角色,我预计在数据库中不会插入新角色。

血淋淋的细节:我也试着调试NHibernate和看到的,由于某种原因EntityIdentityInsertAction收到Role并调用基类的构造。在对基础构造函数的调用中,Id参数是简单的硬编码null。堆栈跟踪还包含对SaveWithGeneratedId()(链中较早的某个地方)的调用,这意味着由于某种原因,现有的Role对象的Id不计入。

这是我已经成功迄今发现的信息。请告诉我做错了什么。

回答

1

我的第一个直觉反应是你不想在用户的Roles集合上使用cascade =“save-update”。

如果您希望对保存用户时保存/更新的实际角色所做的更改进行设置,您只需要这样做。

我假设你打算后,确保关系扑救,但出现这种情况不论你级联设置。