Lin*_*røm 5 sql-server many-to-many entity-framework-core ef-fluent-api
Entity Framework Core 5 引入了多对多关系,而无需直接创建联接表。这很棒并且使编码速度更快,但我遇到了一些挑战。
当处理两个继承同一类(人)的类(学生/教师)之间的关系时,我在迁移后更新数据库时收到错误。
Introducing FOREIGN KEY constraint 'FK_Student_TeacherId' on table 'StudentTeacher' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index. See previous errors.
当不使用继承类时,多对多关系似乎可以顺利工作。
public class Person
{
public int Id { get; set; }
public string SchoolName { get; set; }
public int MyProperty { get; set; }
}
public class Teacher : Person
{
public ICollection<Student> Students { get; set; }
}
public class Student : Person
{
public ICollection<Teacher> Teachers { get; set; }
}
public class PersonConfiguration : IEntityTypeConfiguration<Person>
{
public void Configure(EntityTypeBuilder<Person> builder)
{
builder.ToTable("Persons").HasKey(k => k.Id);
}
}
public class TeacherConfiguration : IEntityTypeConfiguration<Teacher>
{
public void Configure(EntityTypeBuilder<Teacher> builder)
{
builder.ToTable("Persons");
builder.HasMany(p => p.Students).WithMany(t => t.Teachers);
}
}
public class StudentConfiguration : IEntityTypeConfiguration<Student>
{
public void Configure(EntityTypeBuilder<Student> builder)
{
builder.ToTable("Persons");
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过更改手动解决问题onDelete我可以通过将学生或老师ReferentialAction.Restrict
但我认为这个解决方案不好,因为它在连接表中留下了孤立行。
显然,根据这个多对多删除,EF 没有好的候选者来选择限制。所以,配置时必须手动定义关系:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Teacher>()
.HasMany(t => t.Students)
.WithMany(s => s.Teachers)
.UsingEntity<Dictionary<string, object>>(
"Tutelage",
x => x.HasOne<Student>().WithMany().OnDelete(DeleteBehavior.Cascade),
x => x.HasOne<Teacher>().WithMany().OnDelete(DeleteBehavior.Restrict)
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2746 次 |
| 最近记录: |