问题描述
我喜欢在 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 <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);
});