【问题标题】:Yet another many-to-many NHibernate question另一个多对多 NHibernate 问题
【发布时间】:2010-06-28 13:35:11
【问题描述】:

尝试在User和Role之间实现相对简单的关系。 User 可以有多个角色,同样的Role 可以属于任意数量的Users。 Roles 是共享的,即所有 admin Users 都引用了类 Role 的同一个实例。

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>

共有三个数据库表:一个用于Users,一个用于Roles,第三个用于多对多关系(有两个外键:UserId 和RoleId)。主键是这两者的复合键。

有问题的场景:角色是预定义的。在我的 C# 代码中,我正在构造一个 user,同时将 role 附加到它。该角色是从数据库中成功获取的具有正确 id 的对象。我正在尝试将该 用户 保存在数据库中。

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

血腥细节:我还尝试调试 NHibernate,发现由于某种原因 EntityIdentityInsertAction 收到 Role 并调用基本构造函数。在对基本构造函数的调用中,Id 参数是一个简单的硬编码 null。堆栈跟踪还包含对SaveWithGeneratedId() 的调用(在链中的较早位置),这意味着现有Role 对象的Id 由于某种原因未被计入。

这是迄今为止我成功找到的所有信息。请告诉我我做错了什么。

【问题讨论】:

    标签: c# sql nhibernate database


    【解决方案1】:

    我的第一个直觉反应是,您不希望用户的角色集合上的 cascade="save-update" 。

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

    我假设您所追求的是确保关系保存,但无论您的级联设置如何,都会发生这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多