业务需求简而言之:
- 所有员工都需要存储在数据库中
- 有些员工有助手,有些没有
- 有些员工有不止一名助理
- 助理也是员工
明显有点自引用的情况。但与典型的“员工-经理”情况不同的是,这里一个员工可以有 0 个或多个助手。因此,Employee 和员工的 Assistants 的组合需要存储在单独的表中,Employee 和 之间存在一对多关系strong>员工助理。但是我对如何在 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()
关于c# - 使用 EF Code First 建模员工-助理关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39198407/