0

我在团队和员工实体之间有多对多的关系。

我将它们映射如下:

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(书籍、杂志)。Employee2 没有 LoanedItems。

现在我想删除 Team1 和 Team3 中的 Employee1。在 Team 1 中也是 Employee2。因此,当我删除 Employee1 时,我假设 Employee1 和 Team3 也被删除,因为我还假设一个 Team 只有在有 Employe 时才能存在,反之亦然。所以Team1可能不会被删除,因为它有Employee2并且可以仍然存在。

我在新会话中使用了以下代码行:

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

但是会发生什么?-> NHibernate 删除所有团队和所有员工!-> NHibernate 通过将 FK EmployeeID 设置为 NULL 正确更新了我的 LoanedItem 表。

那里有什么问题?

4

2 回答 2

1

我在这里回答了一个类似的问题: 在 NHibernate 中定义多对多关系以允许删除但避免重复记录的正确方法是什么

阅读问题和我的回答可能会帮助您了解您的多对多关联发生了什么。

于 2009-11-28T20:33:12.617 回答
1

因为 HasManyToMany 映射上的 Cascade.All。

如果您希望避免删除级联操作,请改用 Cascade.SaveAndUpdate。

于 2009-11-28T18:32:04.360 回答