我正在尝试在实体框架中首先学习代码,并且在建立关系时遇到问题。这是一个基本的人力资源数据库,为此有两个实体,员工和部门。
员工属于某个部门,该部门有一个团队管理员和一个经理,他们都是有效的员工。我试图使用以下内容对此进行建模:
EMPLOYEE
public int? DepartmentID { get; set; }
public virtual Department Department { get; set; }
Context:
modelBuilder.Entity<Employee>().HasOptional(x => x.Department);
DEPARTMENT
public class Department
{
[Required]
public int DepartmentID { get; set; }
[Required(ErrorMessage = "The description is required.")]
public string Description { get; set; }
public int? ManagerID { get; set; }
public virtual Employee Manager { get; set; }
public int? TeamAdministratorID { get; set; }
public virtual Employee TeamAdministrator { get; set; }
}
Context:
modelBuilder.Entity<Department>().HasOptional(x => x.Manager);
modelBuilder.Entity<Department>().HasOptional(x => x.TeamAdministrator);
显然,我希望Department表只有四列 - DepartmentID,Description,ManagerID和TeamAdministratorID,但它为关系生成了额外的两个,即Manager_EmployeeID和Team_Administrator_EmployeeID。此外,在Employee表中,生成Department_DepartmentID列以使用我在实体中指定的DepartmentID列存储DepartmentID而不是它。
我做错了什么?我如何定义字段和关系以避免代码首先忽略我指定的内容并在数据库中生成自己的导航字段?
答案 0 :(得分:7)
因为您的模型配置不完整 - 您使用Fluent API开始了自己的映射,因此您必须告诉EF这些属性确实是关系的FK。供员工使用:
modelBuilder.Entity<Employee>()
.HasOptional(x => x.Department)
.WithMany()
.HasForeignKey(x => x.DepartmentID);
部门使用:
modelBuilder.Entity<Department>()
.HasOptional(x => x.Manager)
.WithMany()
.HasForeignKey(x => x.ManagerID);
modelBuilder.Entity<Department>()
.HasOptional(x => x.TeamAdministrator);
.WithMany()
.HasForeignKey(x => x.TeamAdministratorID);
顺便说一下。如果在关系的另一侧没有集合导航属性,则很难使用模型(所有WithMany
都是空的)。至少Department
应该有:
public virtual ICollection<Employee> Employees { get; set;}
应将映射修改为:
modelBuilder.Entity<Employee>()
.HasOptional(x => x.Department)
.WithMany(y => y.Employees)
.HasForeignKey(x => x.DepartmentID);
答案 1 :(得分:0)
查看您的员工类
EMPLOYEE
public int? DepartmentID { get; set; }
public virtual Department Department { get; set; }
为了显示您使用ID 和部门的员工与部门之间的关系。实际上,您只需要执行一次 - 通过Department
。 EF默认搜索ID属性并为您链接两个类。所以你的类应该只包含一个ID - 类本身的ID。尝试将ID删除到其他类。