문제

나는 팀과 직원 단체 사이에 많은 관계가 있습니다.

나는 그들을 다음과 같이 맵핑했다.

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를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top