Отображение «многие ко многим» NHibernate не работает - PullRequest
2 голосов
/ 23 декабря 2010

У меня есть файл сопоставления 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>

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

Пользователь создан и вставлен без проблем. Я проверил, что коллекция Role, поле для пользователя, заполняется соответствующей ролью перед вызовом Session.Save ().

Нет и исключения.

UPDATE:

После добавления каскада фактическая вставка в таблицу 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

Ответы [ 2 ]

2 голосов
/ 23 декабря 2010

Вы не указали каскад в отношениях.По умолчанию вставки, обновления и удаления не каскадируются.Больше информации здесь:

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

2 голосов
/ 23 декабря 2010

Я обычно нахожу, что многие из многих проблем вызваны неправильной настройкой свойств каскада.

Попробуйте установить атрибут cascade = "save-update" для ролей, установленных в файле Users.hbm.xml

<set name="Roles" table="UsersRolesBridge"   lazy="false" cascade="save-update">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...