首先使用代码在Entity Framework中进行问题建模关系

| 我试图首先在Entity Framework中学习代码,但在建模关系时遇到了麻烦。这是一个基本的HR数据库,因此有两个实体,雇员和部门。 员工属于部门,部门有团队管理员和经理,两者实际上都是员工。我尝试使用以下方法对此进行建模:
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表中,将使用实体中指定的DepartmentID列生成Department_DepartmentID列来存储DepartmentID,而不是存储DepartmentID。 我究竟做错了什么?我如何定义字段和关系以避免代码首先忽略我指定的内容并在数据库中生成它自己的导航字段?     
已邀请:
        那是因为您的模型配置不完整-您使用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);
    
        查看您的员工班级
EMPLOYEE    
public int? DepartmentID { get; set; }
public virtual Department Department { get; set; }
为了显示员工与部门之间的关系,您使用了ID和Department。实际上,您只需要执行一次-通过
Department
。默认情况下,EF搜索ID属性并为您链接两个类。因此,您的类应仅包含一个ID-类本身的ID。尝试删除其他类的ID。     

要回复问题请先登录注册