パフォーマンス削除多対多のカスケードIが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>
Iロールを削除:
Session.Delete(role);
もしそれが役割であればns 1000ユーザの場合、NHibernateはユーザテーブルに対して1000の削除クエリを生成し、1000のクエリをUsersInRolesへ、ユーザに対しては1つを、UsersInRolesには1を削除します。