我是实体框架的新手,在创建一些示例项目时出现以下错误。
" 实体类型 'StudentSubject' 未映射。"
下面是表格图。
问题是它没有为 StudentSubject 生成映射,它保存了学生和主题表的多对多映射的记录。
但是,如果我将一个新列作为 Id 引入表 StudentSubject 并使其成为主键并删除复合主键,那么它就可以工作。我想知道为什么会发生这种情况,并且我所做的方式是在模型优先方法中做到这一点的仪式方式。
我是实体框架的新手,在创建一些示例项目时出现以下错误。
" 实体类型 'StudentSubject' 未映射。"
下面是表格图。
问题是它没有为 StudentSubject 生成映射,它保存了学生和主题表的多对多映射的记录。
但是,如果我将一个新列作为 Id 引入表 StudentSubject 并使其成为主键并删除复合主键,那么它就可以工作。我想知道为什么会发生这种情况,并且我所做的方式是在模型优先方法中做到这一点的仪式方式。
我建议使用 fluent api 进行映射,因为命名约定有时不适合请求。
以下代码应该可以按您的意愿工作;
protected override void OnModelCreating
(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasMany(t => t.Subject)
.WithMany(t => t.Student)
.Map(m =>
{
m.ToTable("StudentSubjects");
m.MapLeftKey("StudentId");
m.MapRightKey("InstructorID");
});
}
我看不到您的代码,但这是我通常映射它的方式。请注意,这不需要流畅的 api 映射
public class Student
{
public int Id { get; set; }
public string FirstName {get; set; }
public string LastName {get; set; }
public virtual ICollection<StudentSubject> StudentSubjects { get; set; }
}
public class Subject
{
public int Id { get; set; }
public string Name {get; set; }
public virtual ICollection<StudentSubject> StudentSubjects { get; set; }
}
public class StudentSubject
{
[Key]
[Column(Order = 1)]
public int StudentId { get; set; }
[Key]
[Column(Order = 2)]
public int SubjectId{ get; set; }
public virtual Student Student { get; set; }
public virtual Subject Subject { get; set; }
}