2012-01-10 7 views
1

パフォーマンス削除多対多のカスケード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を削除します。

答えて

1

なぜデータベースで直接カスケードで削除を有効にしないのですか?

1

最も簡単なことは、削除をカスケードしないようにNHibernateに指示し、データベースでカスケードを有効にすることです(データベースがサポートしている場合)。 SQL Serverの場合、カスケードオプションは外部キーの設定の下にあります。

これは、Hibernateが親レコードに対して単一のdelete文を発行し、データベースがその操作を内部的にカスケードすることを意味します。

関連する問題