【问题标题】:Entity Framework Core 3.1 Code-First Model - Define model of having multiple many to many relation with selfEntity Framework Core 3.1 Code-First Model - 定义与 self 具有多个多对多关系的模型
【发布时间】:2021-06-27 21:48:50
【问题描述】:

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

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

因此,有一个 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 &lt;MigrationName&gt;-创建数据库模型时遇到此错误-

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

有人可以帮忙吗?

【问题讨论】:

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


    【解决方案1】:

    试试这个:

     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);
                       
                });
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多