【问题标题】:NHibernate Many-to-Many Mapping not workingNHibernate 多对多映射不起作用
【发布时间】:2010-12-23 04:45:51
【问题描述】:

我有一个用于简单用户/角色映射的 Nhibernate 映射文件。

这里是映射文件:

Users.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Sample.Persistence" namespace="Sample.Persistence.Model">
    <class name="User" table="Users">
        <id name="UserKey">
            <generator class="identity"/>
        </id>

        <property name="UserName" column="UserName" type="String" />
        <property name="Password" column="Password" type="Byte[]" />

        <property name="FirstName" column="FirstName" type="String" />
        <property name="LastName" column="LastName" type="String" />
        <property name="Email" column="Email" type="String" />

        <property name="Active" column="Active" type="Boolean" />
        <property name="Locked" column="Locked" type="Boolean" />

        <property name="LoginFailures" column="LoginFailures" type="int" />
        <property name="LockoutDate" column="LockoutDate" type="DateTime" generated="insert" />

        <property name="Expired" column="Expired" type="Boolean" generated="insert"/>

        <set name="Roles" table="UsersRolesBridge"   lazy="false">
            <key column="UserKey" />
            <many-to-many class="Role"
            not-found="exception"
            column="RoleKey" />
        </set>

    </class>
</hibernate-mapping>

角色.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Sample.Persistence" namespace="Sample.Persistence.Model">
    <class name="Role" table="Roles">
        <id name="RoleKey">
            <generator class="identity"/>
        </id>
        <property name="Name" column="Name" type="String" />

        <set name="Users" inverse="true" table="UsersRolesBridge" lazy="false" >
            <key column="RoleKey" />
            <many-to-many class="User" column="UserKey" />
        </set>
    </class>
</hibernate-mapping>

我可以通过 NHibernate 检索每个用户的角色,但是当我去保存一个新对象时,角色不会保存在 Bridge 表中。

用户创建并插入没有问题。在调用 Session.Save() 之前,我检查了角色集合(用户上的一个字段)是否填充了正确的角色键。

也没有抛出异常。

更新:

添加级联后,仍然没有对 M-2-M 表进行实际插入。

来自 Nhibernate 的日志显示如下:

12/22/2010 23:18:11.684 [11] INFO  NHibernate.Engine.Cascade 
Message: processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: Sample.Persistence.Model.User
Exception: 

12/22/2010 23:18:11.686 [11] INFO  NHibernate.Engine.Cascade 
Message: done processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: Sample.Persistence.Model.User
Exception: 

12/22/2010 23:18:11.789 [11] INFO  NHibernate.Engine.Cascade 
Message: processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: Sample.Persistence.Model.User
Exception: 

12/22/2010 23:18:11.792 [11] INFO  NHibernate.Engine.Cascade 
Message: cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for collection: Sample.Persistence.Model.User.Roles
Exception: 

12/22/2010 23:18:11.814 [11] INFO  NHibernate.Engine.Cascade 
Message: done cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for collection: Sample.Persistence.Model.User.Roles
Exception: 

12/22/2010 23:18:11.814 [11] INFO  NHibernate.Engine.Cascade 
Message: done processing cascade NHibernate.Engine.CascadingAction+SaveUpdateCascadingAction for: Sample.Persistence.Model.User

【问题讨论】:

    标签: c# .net sql nhibernate


    【解决方案1】:

    您尚未指定关系的级联。默认情况下,插入、更新和删除不是级联的。更多信息在这里:

    http://ayende.com/Blog/archive/2006/12/02/nhibernatecascadesthedifferentbetweenallalldeleteorphansandsaveupdate.aspx

    【讨论】:

    • 你和 lonmaxx 都有效。还有两个与会话相关的问题(它关闭得太早)并且它没有包含在事务中。我现在正在处理一个错误,它试图更新 ROLE 表,尽管有反向设置。可能需要再问一个问题。
    • 逆向表示从对方更新关系表。保存仍将级联到包含的对象。我不知道一种仅级联关系而不更改子对象的简单方法。最好作为另一个问题提出,以便其他人提供他们的意见。
    【解决方案2】:

    我通常发现很多问题都是由于没有正确设置级联属性引起的。

    尝试在 Users.hbm.xml 文件中设置的角色上设置 cascade = "save-update" 属性

    <set name="Roles" table="UsersRolesBridge"   lazy="false" cascade="save-update">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多