NHibernate多对多关系 - 删除部分关系时的问题

时间:2009-11-28 13:54:42

标签: nhibernate fluent-nhibernate many-to-many cascading-deletes

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

我将它们映射如下:

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也是如此,因为我还假设一个团队只有在拥有Employe时才能存在,反之亦然。因此Team1可能不会被删除,因为它有Employee2并且仍然可以存在。

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

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

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

那里有什么问题?

2 个答案:

答案 0 :(得分:1)

由于Cascade.All在HasManyToMany映射上。

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

答案 1 :(得分:1)

我在这里回答了类似的问题: What is the correct way to define many-to-many relationships in NHibernate to allow deletes but avoiding duplicate records

阅读问题和答案可能会帮助您了解多对多关联的内容。