MC7*_*C76 8 c# code-first entity-framework-4.1
我正在尝试在实体框架内首先学习代码,并且在建立关系时遇到问题.这是一个基本的人力资源数据库,为此有两个实体,员工和部门.
员工属于一个部门,该部门有一个团队管理员和一个经理,他们都是员工.我尝试使用以下方法对此进行建模:
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);
Run Code Online (Sandbox Code Playgroud)
显然,我希望Department表只有四列 - DepartmentID,Description,ManagerID和TeamAdministratorID,但它为关系生成了额外的两个,即Manager_EmployeeID和Team_Administrator_EmployeeID.此外,在Employee表中,生成Department_DepartmentID列以使用我在实体中指定的DepartmentID列存储DepartmentID而不是它.
我究竟做错了什么?我如何定义字段和关系以避免代码首先忽略我指定的内容并在数据库中生成它自己的导航字段?
这是因为您的模型配置不完整 - 您使用Fluent API开始自己的映射,因此您必须告诉EF这些属性确实是关系的FK.供员工使用:
modelBuilder.Entity<Employee>()
.HasOptional(x => x.Department)
.WithMany()
.HasForeignKey(x => x.DepartmentID);
Run Code Online (Sandbox Code Playgroud)
并供部门使用:
modelBuilder.Entity<Department>()
.HasOptional(x => x.Manager)
.WithMany()
.HasForeignKey(x => x.ManagerID);
modelBuilder.Entity<Department>()
.HasOptional(x => x.TeamAdministrator);
.WithMany()
.HasForeignKey(x => x.TeamAdministratorID);
Run Code Online (Sandbox Code Playgroud)
顺便说一句.如果在关系的另一侧没有集合导航属性,则很难使用模型(所有WithMany都是空的).至少Department应该有:
public virtual ICollection<Employee> Employees { get; set;}
Run Code Online (Sandbox Code Playgroud)
并且映射应该修改为:
modelBuilder.Entity<Employee>()
.HasOptional(x => x.Department)
.WithMany(y => y.Employees)
.HasForeignKey(x => x.DepartmentID);
Run Code Online (Sandbox Code Playgroud)