EF Core 与连接实体的类的多对多关系不起作用

问题描述 投票:0回答:1

我正在学习 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
实体来在稍后阶段创建和编辑条目。

是否存在普遍问题或者我犯了一些简单的错误?非常感谢任何帮助。

asp.net-mvc entity-framework
1个回答
0
投票

这种情况的典型配置是,如果您不需要在 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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.