많은 관계에 대한 많은 관계 - 관계의 일부를 삭제할 때의 문제
-
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 개의 대출 편집 (책, 잡지)이 있습니다. Employee2에는 대출이 없습니다.
이제 Team1과 Team3에있는 Employee1을 삭제하고 싶습니다. 팀 1에서는 또한 Employee2입니다. 따라서 Employee1을 삭제할 때 Employee1이 삭제되고 Team3가 삭제되었다고 가정합니다. 또한 팀이 Employe가 있고 그 반대의 경우에만 존재할 수 있다고 가정하기 때문입니다. 따라서 Team1은 Employee2가 있고 여전히 존재할 수 있기 때문에 삭제되지 않을 수 있습니다.
새로운 세션과 함께 다음 코드 행을 사용했습니다.
var loadedEmployee = session.Get<Employee>(1);
session.Delete(loadedEmployee);
transaction.Commit();
그러나 어떻게됩니까? -> Nhibernate는 모든 팀과 모든 직원을 삭제합니다! -> nhibernate FK EmployeeID를 NULL로 설정하여 대출 테이블을 올바르게 업데이트했습니다.
무엇이 잘못 되었습니까?
해결책
여기서 비슷한 질문에 대답했습니다.삭제를 허용하지만 중복 레코드를 피하기 위해 nhibernate에서 다수의 관계를 정의하는 올바른 방법은 무엇입니까?
질문과 내 대답을 읽으면 여러분의 다수의 협회에서 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것입니다.
다른 팁
캐스케이드 때문에 hasmanytomany 매핑에 대한 모든 것.
삭제 캐스케이드 동작을 피하려면 대신 Cascade.saveandupdate를 사용하십시오.