2

我有具有以下结构的现有数据库: 在此处输入图像描述

我正在使用 EF fluent API 来配置表之间的关系:

public GroupEntityConfiguration()
{
    HasMany(x => x.Employees).WithRequired().HasForeignKey(x => x.GroupId).WillCascadeOnDelete(true);
}

public EmployeeEntityConfiguration()
{            
    HasOptional(x => x.InnerGroupMember).WithRequired();
}

应用此配置后,我可以添加新员工、新 InnerGroupMember 或获取数据。当我尝试删除员工时出现问题。然后我得到一个例外:

无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

据我了解,上述异常与 GroupId 外键有关。尝试修复它我正在向 EmployeeEntityConfiguration 添加以下行:

HasKey(x => new { x.Id, x.GroupId});

但是在添加它之后,我得到了另一个我认为与 InnerGroupMember 对象相关的异常:

列名“Guest_Id”无效。列名“Guest_GroupId”无效。

如果我注释掉 InnerGroupMember 导航属性并删除它的配置,则可以删除 Employee。

您能否给我一个提示我做错了什么以及如何配置实体以能够执行所有需要的操作?谢谢!

4

2 回答 2

2

我有一个现有的组实体,我想从员工组集合中删除员工:

var group = groupRepository.Find(groupId);
group.RemoveEmployee(employeeId);
_unitOfWork.Save();

Group 实体中的 RemoveEmployee 函数如下所示:

public void RemoveEmployee(int employeeId)
{
    var employee = Employees.Single(n => n.Id == employeeId);
    Employees.Remove(employee);
}

这就是为什么我得到一个例外:

无法更改关系,因为一个或多个外键属性不可为空......

阅读这篇文章后,我想修复它,HasKey(x => new { x.Id, x.GroupId});在 EmployeeEntityConfiguration 中添加导致第二个异常的函数:

列名“Guest_Id”无效。列名“Guest_GroupId”无效。

实际上我做了这一步(我的意思是添加 HasKey 函数)而不改变数据库结构。为了让它工作,在Employees表中我必须创建复合键——Id和GroupId的组合,这也是一个外键。此修改会强制更改 InnerGroupMembers 表。DB 结构现在如下所示: 在此处输入图像描述

现在我能够以我在开始时展示的方式删除 Employee 。

无论如何,我不会寻求这个解决方案。它们是实现我想要的不同方式。以下是一些链接:

于 2013-03-10T13:50:16.563 回答
0

对于一对一关系,默认情况下不启用级联删除,即使对于必需的关系也不启用(因为这是必需的一对多关系的情况,即:WillCascadeOnDelete(true)在您的一对多映射中是多余的) . 您必须始终明确地为一对一关系定义级联删除:

HasOptional(x => x.InnerGroupMember).WithRequired().WillCascadeOnDelete(true);

当您Employee现在删除时,数据库也会删除相关InnerGroupMember的并且异常应该消失。

于 2013-03-09T18:43:08.857 回答