我正在学习 Microsoft 的 .NET MVC 教程,并尝试处理与 EF Core 的多对多关系。
https://learn.microsoft.com/en-us/ef/core/modeling/relationships/many-to-many
和
https://learn.microsoft.com/en-us/aspnet/core/data/ef-mvc/read-lated-data?view=aspnetcore-8.0
简单的多对多关系似乎运行良好。型号如下:
public class Instructor
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<Course> Courses { get; } = new ();
}
和
public class Course
{
public int Id { get; set; }
public string CourseName { get; set; }
public int Credit { get; set; }
public List<Instructor> Instructors { get; } = new();
}
此时EF Core会自动创建连接表。当我手动填充连接表(无法为连接表播种数据)时,我可以使用
.Include()
获取每个实体的相关数据。
但是,当我创建第三个模型时
[Keyless]
public class CourseInstructor
{
public int InstructorId { get; set; }
public int CourseId { get; set; }
}
添加迁移时出现错误。
异常“不能将表‘CourseInstructor’用于实体类型‘CourseInstructor’,因为它用于实体类型‘CourseInstructor (Dictionary
)’和潜在的其他实体类型,但没有链接关系。将外键添加到主键属性上的“CourseInstructor”,并指向映射到“CourseInstructor”的另一个实体类型上的主键。'
我尝试添加外键来加入实体,指向相应的主键,但出现相同的错误。当我添加进出连接实体的进一步导航时,同样的问题仍然存在。我还尝试避免无密钥方法并添加连接实体的密钥但无济于事。
根据相同的教程,我将需要这个连接
CourseInstructor
实体来在稍后阶段创建和编辑条目。
是否存在普遍问题或者我犯了一些简单的错误?非常感谢任何帮助。
这种情况的典型配置是,如果您不需要在 CourseInstructor 类中存储任何其他字段,尽管您可以根据您的设置对其进行修改。
public class InstructorConfiguration : IEntityTypeConfiguration<Instructor>
{
public void Configure(EntityTypeBuilder<Instructor> builder)
{
builder.ToTable("Instructors");
// Primary key
builder.HasKey(i => i.Id);
// Other property configurations...
// Many-to-Many relationship with Course
builder
.HasMany(i => i.Courses)
.WithMany(c => c.Instructors)
.UsingEntity(j => j.ToTable("InstructorCourses"));
}
}
public class CourseConfiguration : IEntityTypeConfiguration<Course>
{
public void Configure(EntityTypeBuilder<Course> builder)
{
builder.ToTable("Courses");
// Primary key
builder.HasKey(c => c.Id);
// Other property configurations...
// Many-to-Many relationship with Instructor
builder
.HasMany(c => c.Instructors)
.WithMany(i => i.Courses)
.UsingEntity(j => j.ToTable("InstructorCourses"));
}
}
public class YourDbContext : DbContext
{
public DbSet<Instructor> Instructors { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new InstructorConfiguration());
modelBuilder.ApplyConfiguration(new CourseConfiguration());
}
}