NHibernate多対多リレーションシップ-リレーションシップの一部を削除する際の問題
-
06-07-2019 - |
質問
チームと従業員エンティティの間には多対多の関係があります。
次のようにマッピングしました:
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を使用します。
所属していません StackOverflow