Entity Framework Core 3.1 Code-First Model - 定义与 self 具有多个多对多关系的模型

问题描述

我喜欢在 ASP.Net Core 3.1 中创建数据库模型。我在 EF Core 3.1 中使用 Code First 方法

我喜欢为这种关系创建一个模型-

ERD

因此,有一个 Employee 表,每个员工都有多个老板,每个老板都有多个下属。但每个老板和每个下属也是员工。我所做的是这样的-

员工模型-

public class Employee
{
    [HiddenInput(displayValue = false),display(Name = "ID")]
    [Key()]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column(Order = 1)]
    public Guid? Id { get; set; } = Guid.NewGuid();

    [Column("Name"),required(ErrorMessage = "Term Name should be given"),display(Name = "Term Name",Prompt = "Please Give Term Name")]
    [DataType(DataType.Text)]
    public string Name { get; set; }

    public ICollection<Boss> Bosses { get; set; }
    public ICollection<Subordinate> Subordinates { get; set; }
    ............
    ............
}

但是我在通过命令 Add-Migration <MigrationName>-

创建数据库模型期间收到此错误

无法确定类型为“ICollection”的导航属性“Employee.Bosses”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性

有人可以帮忙吗?

解决方法

ef core 3.1 不支持直接多对多关系。

看到这个:https://docs.microsoft.com/de-de/ef/core/what-is-new/ef-core-5.0/whatsnew

如果您不能使用 ef core >= 5,那么您必须为 EmployeeBoss 实体创建一个导航属性。

,

试试这个:

 public partial class Employee
    {
        public Employee()
        {
            EmployeeBossEmployees = new HashSet<EmpoyeeBoss>();
            EmployeeBossBosses = new HashSet<EmpoyeeBoss>();
        }

        [Key]
        public int Id { get; set; }

        [InverseProperty(nameof(EmpoyeeBoss.Employee))]
        public virtual ICollection<EmpoyeeBoss> EmployeeBossEmployees { get; set; }
        [InverseProperty(nameof(EmpoyeeBoss.Boss))]
        public virtual ICollection<EmpoyeeBoss> EmployeeBossBosses { get; set; }
    }

 public partial class EmpoyeeBoss
    {
        [Key]
        public int Id { get; set; }
        public int BossId { get; set; }
        public int EmployeeId { get; set; }

        [ForeignKey(nameof(EmployeeId))]
        [InverseProperty("EmployeeBossEmployees")]
        public virtual Employee Employee { get; set; }
        [ForeignKey(nameof(BossId))]
        [InverseProperty("EmployeeBossBosses")]
        public virtual Employee Boss { get; set; }
    }

并包含在您的 dbcontext 中:

        public virtual DbSet<Employee> Employees { get; set; }
        public virtual DbSet<EmpoyeeBoss> EmployeeBosses { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<EmpoyeeBoss>(entity =>
            {
                entity.HasOne(d => d.Employee)
                    .WithMany(p => p.EmployeeBossEmployees)
                    .HasForeignKey(d => d.EmployeeId)
                    .OnDelete(DeleteBehavior.ClientSetNull);
                   

                entity.HasOne(d => d.Boss)
                    .WithMany(p => p.EmployeeBossBosses)
                    .HasForeignKey(d => d.BossId);
                   
            });