如何在实体框架核心中建立一对多关系

时间:2020-03-09 07:46:09

标签: asp.net-core entity-framework-core

谁可以告诉您在这种情况下如何制作模型。较早的一名雇员(到今天为止,有解雇的日期)可以担任多个职位,但现在他们只能担任一个职位(没有解雇的日期)。

public class Employee
{
    [Key]
    public int EmployeeId { get; set; }
    public Position Position { get; set; }
    public DateTime DateStart { get; set; }
    public DateTime DateQuit { get; set; }
}

public class Position
{
    [Key]
    public int PositionId { get; set; }
}

我是否需要将位置下一个代码添加到类中?

public Employee Employee { get; set; }

我是否需要将下一个代码添加到Employee类?

public int PositionId { get; set; }

并且有必要使方法OnModelCreating吗?

protected override void OnModelCreating(Modelbuilder modelBuilder)
{
    modelBuilder.Entity<Company>()
            .HasMany(c => c.Employees)
            .WithOne(e => e.Position);
}

3 个答案:

答案 0 :(得分:1)

  1. 我是否需要将位置下一个代码添加到类中?

首先,它应该是public ICollection<Employee> Employees { get; set; }

第二,它是可选的。如果您想知道某个职位的员工是谁,则可以添加它。

  1. 我是否需要将下一个代码添加到Employee类?

是的。这是定义两个实体之间关系的外键。

  1. 是否有必要使方法OnModelCreating?

是的,因为然后在EntityFramework中适当地配置了模型。


如果要在职位实体中包含员工列表,则应为:

modelBuilder.Entity<Position>()
    .HasMany<Employee>(g => g.Employees)
    .WithRequired(s => s.Position)
    .HasForeignKey<int>(s => s.PositionId);

modelBuilder.Entity<Employee>()
    .HasRequired<Position>(s => s.Position)
    .WithMany(g => g.Employees)
    .WithForeignKey<int>(s => s.PositionId);

如果您不需要职位实体中的员工列表,则应为:

modelBuilder.Entity<Employee>()
    .HasRequired<Position>(s => s.Position)
    .WithMany()
    .WithForeignKey<int>(s => s.PositionId);

答案 1 :(得分:0)

在Employee中添加职位表的外键

   public class Employee
        {
            [Key]
            public int EmployeeId { get; set; }
            public Position Position { get; set; }
            public DateTime DateStart { get; set; }
            public DateTime DateQuit { get; set; }
            public int PositionId { get; set; }
            public virtual Position Position { get; set;}
        }

然后在职位表中添加员工的集合

 public class Position
    {
        [Key]
        public int PositionId { get; set; }
        public virtual ICollection<Employee> Employees { get; set; }  

    }

答案 2 :(得分:0)

正如您所说,您期望一位雇员有一个职位,但一个职位一次可以有多名员工。简而言之,它的one-to-manyPositionEmployee之间。

因此您可以执行以下操作:

public class Employee
{
    [Key]
    public int EmployeeId { get; set; }
    public int PositionId { get; set; }
    public DateTime DateStart { get; set; }
    public DateTime DateQuit { get; set; }

    public Position Position { get; set; }
}

public class Position
{
    [Key]
    public int PositionId { get; set; }
}

然后在OnModelCreating中输入

protected override void OnModelCreating(Modelbuilder modelBuilder)
{
    modelBuilder.Entity<Employee>()
            .HasOne(e => e.Position)
            .WithMany()
            .HasForeignKey(e => e.PositionId);
}

要了解有关EF核心关系的更多信息:EF Core Relationships

相关问题