以下是业务要求,简而言之:
>所有员工都需要存储在数据库中
>有些员工有助手,有些则没有助手
>有些员工有一个以上的助手
>助理也是员工
显然有一点自我引用的情况.但与典型的“员工 – 经理”情况的区别在于,这里一个员工可以有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()