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)
| 归档时间: |
|
| 查看次数: |
672 次 |
| 最近记录: |