为什么在我的数据库中创建了额外的(不需要的)列,以及如何修复它?- ASP.NET 核心

Ash*_*byS 1 c# entity-framework-core

我目前正在尝试QuestiontoCourses在我的数据库中创建一个表。该表应包含值QuestId和的复合主键CourseId,这两个值都是与表Question和相关的外键Course
但是,每当我为其添加迁移时,QuestionQuestId都会创建一个名为的额外列并成为外键,并且QuestId不被视为外键。

我的问题类确实包含QuestId.

我尝试手动更改数据库和迁移,但是在运行此语句时QuestiontoCoursesList = _context.QuestiontoCourses.ToList();,出现错误,提示QuestionQuestId找不到。

这是在一个.cs文件上。我的程序位于 ASP.NET 6.0 Core Web App 上。

我是一名学生,具有 ASP.NET Core 的基本知识,并且了解如何解决此问题,因此非常感谢您提供尽可能多的简化解释。

这是我的QuestiontoCourses.cs模型的代码:

namespace AQA_A_Level_CS_NEA__Suvat_Solver_.Models
{
    public class QuestiontoCourses
    {
        public Question Question { get; set; }
        public int QuestId { get; set; }

        public Course Course { get; set; }
        public int CourseId { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的课程代码Question

namespace AQA_A_Level_CS_NEA__Suvat_Solver_.Models
{
    public class Question
    {
        public int QuestId { get; set; }

        public string Difficulty { get; set; }
        public char AnswType { get; set; }
        public float AnswTrue { get; set; }
        public string QuestDetails { get; set; }
        public string QuestSolved { get; set; }

        public List<QuestiontoCourses> QuestiontoCourses { get; set; }

    }
}
Run Code Online (Sandbox Code Playgroud)

这是我从模型迁移的代码QuestiontoCourses.cs

using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace AQA_A_Level_CS_NEA__Suvat_Solver_.Migrations
{
    public partial class QuestionCourseRelation : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "QuestiontoCourses",
                columns: table => new
                {
                    QuestId = table.Column<int>(type: "int", nullable: false),
                    CourseId = table.Column<int>(type: "int", nullable: false),
                    QuestionQuestId = table.Column<int>(type: "int", nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_QuestiontoCourses", x => new { x.QuestId, x.CourseId });
                    table.ForeignKey(
                        name: "FK_QuestiontoCourses_Courses_CourseId",
                        column: x => x.CourseId,
                        principalTable: "Courses",
                        principalColumn: "CourseId",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_QuestiontoCourses_Question_QuestionQuestId",
                        column: x => x.QuestionQuestId,
                        principalTable: "Question",
                        principalColumn: "QuestId",
                        onDelete: ReferentialAction.Cascade);
                });

            migrationBuilder.CreateIndex(
                name: "IX_QuestiontoCourses_CourseId",
                table: "QuestiontoCourses",
                column: "CourseId");

            migrationBuilder.CreateIndex(
                name: "IX_QuestiontoCourses_QuestionQuestId",
                table: "QuestiontoCourses",
                column: "QuestionQuestId");
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "QuestiontoCourses");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码ApplicationDbContext.cs

namespace AQA_A_Level_CS_NEA__Suvat_Solver_.Data
{
    using Microsoft.EntityFrameworkCore;
    using AQA_A_Level_CS_NEA__Suvat_Solver_.Models;
    public class ApplicationDbContext : DbContext
    {

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {

        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Question>()
            .HasKey(c => c.QuestId);
            modelBuilder.Entity<UsertoCourses>()
            .HasKey(c => new { c.UserId, c.CourseId });
            modelBuilder.Entity<QuestiontoCourses>()
            .HasKey(c => new { c.QuestId, c.CourseId });
        }

        public DbSet<User> User { get; set; }
        public DbSet<Course> Courses { get; set; }
        public DbSet<Question> Question { get; set; }
        public DbSet<UsertoCourses> UsertoCourses { get; set; }
        public DbSet<QuestiontoCourses> QuestiontoCourses { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

作为参考,以下是迁移代码ApplicationDbContextModelSnapshot.cs

// <auto-generated />
using AQA_A_Level_CS_NEA__Suvat_Solver_.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

#nullable disable

namespace AQA_A_Level_CS_NEA__Suvat_Solver_.Migrations
{
    [DbContext(typeof(ApplicationDbContext))]
    partial class ApplicationDbContextModelSnapshot : ModelSnapshot
    {
        protected override void BuildModel(ModelBuilder modelBuilder)
        {
#pragma warning disable 612, 618
            modelBuilder
                .HasAnnotation("ProductVersion", "6.0.8")
                .HasAnnotation("Relational:MaxIdentifierLength", 128);

            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1);

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.Course", b =>
                {
                    b.Property<int>("CourseId")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("int");

                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("CourseId"), 1L, 1);

                    b.Property<string>("CourseName")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");

                    b.HasKey("CourseId");

                    b.ToTable("Courses");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.Question", b =>
                {
                    b.Property<int>("QuestId")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("int");

                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("QuestId"), 1L, 1);

                    b.Property<float>("AnswTrue")
                        .HasColumnType("real");

                    b.Property<string>("AnswType")
                        .IsRequired()
                        .HasColumnType("nvarchar(1)");

                    b.Property<string>("Difficulty")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");

                    b.Property<string>("QuestDetails")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");

                    b.Property<string>("QuestSolved")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");

                    b.HasKey("QuestId");

                    b.ToTable("Question");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.QuestiontoCourses", b =>
                {
                    b.Property<int>("QuestId")
                        .HasColumnType("int");

                    b.Property<int>("CourseId")
                        .HasColumnType("int");

                    b.Property<int>("QuestionQuestId")
                        .HasColumnType("int");

                    b.HasKey("QuestId", "CourseId");

                    b.HasIndex("CourseId");

                    b.HasIndex("QuestionQuestId");

                    b.ToTable("QuestiontoCourses");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.User", b =>
                {
                    b.Property<int>("UserId")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("int");

                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("UserId"), 1L, 1);

                    b.Property<int>("UserCorrectAnsw")
                        .HasColumnType("int");

                    b.Property<string>("UserName")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");

                    b.Property<string>("UserPass")
                        .IsRequired()
                        .HasColumnType("nvarchar(max)");

                    b.Property<int>("UserTotalAnsw")
                        .HasColumnType("int");

                    b.HasKey("UserId");

                    b.ToTable("User");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.UsertoCourses", b =>
                {
                    b.Property<int>("UserId")
                        .HasColumnType("int");

                    b.Property<int>("CourseId")
                        .HasColumnType("int");

                    b.HasKey("UserId", "CourseId");

                    b.HasIndex("CourseId");

                    b.ToTable("UsertoCourses");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.QuestiontoCourses", b =>
                {
                    b.HasOne("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.Course", "Course")
                        .WithMany("QuestiontoCourses")
                        .HasForeignKey("CourseId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.Question", "Question")
                        .WithMany("QuestiontoCourses")
                        .HasForeignKey("QuestionQuestId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Course");

                    b.Navigation("Question");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.UsertoCourses", b =>
                {
                    b.HasOne("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.Course", "Course")
                        .WithMany("UsertoCourses")
                        .HasForeignKey("CourseId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.HasOne("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.User", "User")
                        .WithMany("UsertoCourses")
                        .HasForeignKey("UserId")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();

                    b.Navigation("Course");

                    b.Navigation("User");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.Course", b =>
                {
                    b.Navigation("QuestiontoCourses");

                    b.Navigation("UsertoCourses");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.Question", b =>
                {
                    b.Navigation("QuestiontoCourses");
                });

            modelBuilder.Entity("AQA_A_Level_CS_NEA__Suvat_Solver_.Models.User", b =>
                {
                    b.Navigation("UsertoCourses");
                });
#pragma warning restore 612, 618
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

非常感谢。

小智 6

在ef core中,表名必须与表键名相同,这样才能被识别。例如 :

public class QuestiontoCourses
{
    public Question Question { get; set; }
    public int QuestionId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果你不想使用这个名字,你可以使用 Fluent api

例如 :

public class QuestiontoCoursesConfigurations : IEntityTypeConfiguration<QuestiontoCourses>
{
    public void Configure(EntityTypeBuilder<QuestiontoCourses> builder)
    {
        builder.HasOne(x => x.Question)
            .WithMany(x => x.QuestiontoCourses)
            .HasForeignKey(x => x.QuestId);
    }
}
Run Code Online (Sandbox Code Playgroud)