c# - 使用 EF Code First 建模员工-助理关系

标签 c# asp.net-mvc ef-code-first entity-framework-6 self-referencing-table

业务需求简而言之:

  • 所有员工都需要存储在数据库中
  • 有些员工有助手,有些没有
  • 有些员工有不止一名助理
  • 助理也是员工

明显有点自引用的情况。但与典型的“员工-经理”情况不同的是,这里一个员工可以有 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/

相关文章:

asp.net-mvc - 带有 lambda 表达式的 ASP.net MVC 操作 URL

javascript - 加载时如何为下拉列表中的第一项运行 LoadPartial 函数?

javascript - 从客户端检测到潜在危险的 Request.QueryString 值(Html ="&lt;!DOCTYPE html PUBLI...")asp.net mvc

c# - 异步/等待 Entity Framework ObjectContext 处置

c# - WebClient 能够执行多个请求

c# - 在 C# 中处理 Outlook 邮件中的超链接单击事件

c# - EF Code First 使用 IEnumerable <> 进行递归查询?

asp.net-mvc-3 - 为什么延迟加载在 razor View (cshtml 文件)中不起作用?

c# - 如何找到EF CodeFirst CTP5中针对更改进行跟踪的所有对象的来源?

c# - 出现错误“必须声明一个主体,因为它没有标记为抽象或外部”