【问题标题】:Entity Framework relationship mapping实体框架关系映射
【发布时间】:2017-01-09 14:33:43
【问题描述】:

我有以下两个类:

public class Department
{
    public int DepartmentID { get; set; }    
    public string Name { get; set; }    
    public int EmployeeCount { get; set; }    
    public int MinimumCoverage { get; set; }        
    public virtual List<Approver> Approvers { get; set; } 
    public virtual List<Employee> Employees { get; set; }
}

public class Employee
{
    public int EmployeeID { get; set; }
    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }  
    public int DepartmentID { get; set; }
    public virtual Department Department { get; set; }
    public DateTime StartDate { get; set; }                
    public decimal DaysAccrued { get; set; }
    public decimal DaysUsed { get; set; }
    public decimal DaysRemaining { get; set; }  
    public bool IsManager { get; set; }
    public bool IsApprover { get; set; }
}

我想让一个员工属于一个使用 DepartmentID 的部门,并且在部门类中可以列出部门中的所有员工,但我在 EF 设置中遇到以下错误:

附加信息:“HolidayManagerContext.Employees”中的实体参与“Employee_Department”关系。找到 0 个相关的“Employee_Department_Target”。 1 'Employee_Department_Target'

我的上下文如下:

public partial class HolidayManagerContext : DbContext
    {
        public HolidayManagerContext()
            : base("name=HolidayManagerContext")
        {
        }

        public virtual DbSet<Employee> Employees { get; set; }
        public virtual DbSet<Approver> Approvers { get; set; }
        public virtual DbSet<Request> Requests { get; set; }
        public virtual DbSet<Decision> Decisions { get; set; }
        public virtual DbSet<Department> Departments { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Employee>()
                .Property(e => e.DaysAccrued)
                .HasPrecision(18, 1);

            modelBuilder.Entity<Employee>()
                .Property(e => e.DaysUsed)
                .HasPrecision(18, 1);

            modelBuilder.Entity<Employee>()
                .Property(e => e.DaysRemaining)
                .HasPrecision(18, 1);

            modelBuilder.Entity<Employee>()
                .HasRequired(e => e.Department)
                .WithMany()
                .WillCascadeOnDelete(false);

        }
    }

【问题讨论】:

  • 代码优先?任何 Fluent 配置?
  • @IvanStoev 问题已更新

标签: entity-framework


【解决方案1】:

流畅的配置

modelBuilder.Entity<Employee>()
    .HasRequired(e => e.Department)
    .WithMany()
    .WillCascadeOnDelete(false);

与模型导航属性 (1) 和 FK 字段 (2) 不匹配,导致您遇到问题。

应该是这样的:

modelBuilder.Entity<Employee>()
    .HasRequired(e => e.Department)
    .WithMany(d => d.Employees) // (1)
    .HasForeignKey(e => e.DepartmentID) // (2)
    .WillCascadeOnDelete(false);

请注意,EF6 默认 FK 名称约定为 PropertyName_Id(在您的情况下为 Department_Id)。

【讨论】:

  • 感谢 Ivan 的解释,非常感谢
【解决方案2】:

使用 Code First 数据注释,您可以通过编辑模型来解决您的问题,它应该如下所示:

public class Department
{
    public Department()
    {
        Approvers = new List<Approver>();
        Employees = new List<Employee>();
    }
    public int DepartmentId { get; set; }
    public string Name { get; set; }
    public int EmployeeCount { get; set; }
    public int MinimumCoverage { get; set; }


    public virtual ICollection<Approver> Approvers { get; set; }
    public virtual ICollection<Employee> Employees { get; set; }
}

public class Employee
{

    public int EmployeeId { get; set; }
    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime StartDate { get; set; }
    public decimal DaysAccrued { get; set; }
    public decimal DaysUsed { get; set; }
    public decimal DaysRemaining { get; set; }
    public bool IsManager { get; set; }
    public bool IsApprover { get; set; }

    public int DepartmentId { get; set; }

    [ForeignKey("DepartmentId")]
    public virtual Department Department { get; set; }
}

如果没有 EF conventions,您需要在设置 FK 的属性上使用 ForeignKey 属性

 public class Employee
  {
        ...
        public int DepartmentID { get; set; }

        [ForeignKey("DepartmentID")]
        public virtual Department Department { get; set; }
  }

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多