c# – 使用EF Code First建模Employee-Assistant关系

以下是业务要求,简而言之:

>所有员工都需要存储在数据库中
>有些员工有助手,有些则没有助手
>有些员工有一个以上的助手
>助理也是员工

显然有一点自我引用的情况.但与典型的“员工 – 经理”情况的区别在于,这里一个员工可以有0个或多个助理.因此,Employee和EmployeeAssistant的组合需要存储在Employee和EmployeeAssistant之间的一对多关系中的单独表中.但我很困惑如何在Entity Framework 6 Code First中对此进行建模.

我从这开始:

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class EmployeeAssistant
{
   [ForeignKey("Employee")]
   public int EmployeeId { get; set; }
   public virtual Employee Employee { get; set; }

   [ForeignKey("Assistant")]
   public int AssistantId { get; set; }
   public virtual Employee Assistant { get; set; }
}

但是在Update-Database命令期间出现错误:

Introducing FOREIGN KEY constraint ‘FK_dbo.EmployeeAssistant_dbo.Employee_EmployeeId’ on table ‘EmployeeAssistant’ may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我错过了什么?我应该采用不同的方法吗?

最佳答案 由于每个员工可能有一个或多个助理(每个助理将有一个或多个员工)并且所有员工都是员工,因此最简单的解决方案是一个班级,其中包括两个助理和员工的集合,这些关系将由框架管理:

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<Employee> Assistants { get; set; }
    public ICollection<Employee> Employees { get; set; }
}

当您使用包管理器控制台添加迁移时,它将自动创建两个表,一个用于员工,另一个表用于多对多关系.

那么您所要做的就是使用Include扩展方法找到相关的助理和/或员工.

db.Employees.Where(x=>x.Id==id).Include(x=>x.Assistants).FirstOrDefault()

和/或

db.Employees.Where(x=>x.Id==id).Include(x=>x.Employees).FirstOrDefault()

点赞