NHibernate多対多リレーションシップ-リレーションシップの一部を削除する際の問題

StackOverflow https://stackoverflow.com/questions/1812573

質問

チームと従業員エンティティの間には多対多の関係があります。

次のようにマッピングしました:

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        // identifier mapping
        Id(p => p.Id).Column("EmployeeID");

        // column mapping
        Map(p => p.EMail);
        Map(p => p.LastName);
        Map(p => p.FirstName);

        // relationship mapping
        HasManyToMany(m => m.Teams).Table("EmployeeTeam")
            .Inverse()
            .Cascade.All()
            .AsSet()
            .LazyLoad()
            .ParentKeyColumn("EmployeeID")
            .ChildKeyColumn("TeamID");

        HasMany(p => p.LoanedItems).Cascade.SaveUpdate().KeyColumn("EmployeeId");
    }
}

public class TeamMap : ClassMap<Team>
{
    public TeamMap()
    {
        // identity mapping
        Id(p => p.Id).Column("TeamID");

        // column mapping
        Map(p => p.Name);

        // relationship mapping
        HasManyToMany(m => m.Employees)
            .Table("EmployeeTeam")
            .LazyLoad()
            .Cascade.All()
            .AsSet()
            .ParentKeyColumn("TeamID")
            .ChildKeyColumn("EmployeeID");
    }
}

次に、3つのチームと2つの従業員を作成しました:

TeamID  EmployeeID
1       1
1       2
2       2
3       1

Employee1には2つのLoanedItems(Books、Magazines)もあります。 Employee2にはLoanedItemsがありません。

ここで、Team1とTeam3にいるEmployee1を削除します。チーム1でもEmployee2です。 したがって、Employee1を削除するとき、Employee1とTeam3も削除されると仮定します。これは、TeamにはEmployeが存在する場合にのみ存在でき、その逆も同様だからです。そのため、Team1にはEmployee2があり、まだ存在できるため、Team1は削除されない可能性があります。

新しいセッションで次のコード行を使用しました:

var loadedEmployee = session.Get<Employee>(1);
session.Delete(loadedEmployee);
transaction.Commit();

しかし、どうなりますか? -&gt; NHibernateはすべてのチームとすべての従業員を削除します! -&gt; NHibernateは、FK EmployeeIDをNULLに設定することにより、LoanedItemテーブルを正しく更新しました。

そこで何が間違っているのですか?

役に立ちましたか?

解決

ここで同様の質問に答えました。 何NHibernateで多対多の関係を定義して、削除を許可するが重複レコードを回避する正しい方法です

質問と私の回答を読むことで、多対多の関係で何が起こっているのかを理解するのに役立つかもしれません。

他のヒント

HasManyToManyマッピングのCascade.Allのため。

カスケード削除アクションを回避する場合は、代わりにCascade.SaveAndUpdateを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top