производительность каскадного удаления «многие ко многим» - PullRequest
1 голос
/ 10 января 2012

У меня есть 2 объекта: пользователь и роль

Role.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="UserManagmentStudio.Domain.Model"
                   assembly="UserManagmentStudio.Domain">
  <class name="Role" table="Roles" lazy="true"  dynamic-update="false">
    <id name="Id" column="Id" type="int">
      <generator class="identity" />
    </id>
    <property name="Name" not-null="true" length="50" />
    <set name="Users" table="UsersInRoles"  fetch="subselect" lazy="extra" cascade="delete">
      <key column="RoleId"/>
      <many-to-many column="UserId"  class="User"/>
    </set>
  </class>
</hibernate-mapping>

User.hbm.sql:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="UserManagmentStudio.Domain.Model"
                   assembly="UserManagmentStudio.Domain">
  <class name="User" table="Users"  dynamic-update="false">
    <id name="Id" column="Id" type="int">
      <generator class="identity" />
    </id>
    <property name="Password" not-null="true" length="50"/>
    <property name="FirstName" not-null="true" length="50"/>
    <property name="LastName" not-null="true" length="50"/>
    <property name="Login" not-null="true" length="50"/>
    <property name="Birthday" not-null="true"/>
    <property name="IsActive" not-null="true" />
    <property name="RegistrationDate" not-null="true" />
    <set name="Roles" table="UsersInRoles" fetch="subselect" lazy="extra" cascade="none" >
      <key column="UserId" />
      <many-to-many column="RoleId"  class="Role"/>
    </set>
  </class>
</hibernate-mapping>

Когда я удаляю роль:

Session.Delete(role);

Если его роль содержит 1000 пользователей, NHibernate генерирует 1000 запросов на удаление в таблицу User и 1000 запросов на удаление в UsersInRoles вместо 1 для Users и 1 для UsersInRoles.

Ответы [ 2 ]

1 голос
/ 10 января 2012

Самое простое, что нужно сделать - это попросить NHibernate не каскадно удалять и включать каскад в вашей базе данных (если ваша база данных это поддерживает).Для SQL Server параметр каскада находится в настройках внешнего ключа.

Это означает, что NHibernate выдаст один оператор удаления для родительской записи, а база данных будет каскадно выполнять операцию внутри.

1 голос
/ 10 января 2012

Почему бы вам просто не включить Delete on Cascade прямо в базе данных?

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