ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-02 01:52:02  阅读:155  来源: 互联网

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


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

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

显然有一点自我引用的情况.但与典型的“员工 – 经理”情况的区别在于,这里一个员工可以有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()

标签:c,asp-net-mvc,ef-code-first,entity-framework-6,self-referencing-table
来源: https://codeday.me/bug/20190702/1353035.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有