gpt4 book ai didi

c# - Entity Framework Code First 中的多对多关系和使用 "virtual"关键字相互访问

转载 作者:太空狗 更新时间:2023-10-30 00:01:50 24 4
gpt4 key购买 nike

这段摘录代码成功地创建了一个多对多关系,其中包含一个包含额外数据的显式 Junction 表。

问题:我希望能够从学生访问类(class),反之亦然,
(因此注释的虚拟属性。但如果我取消注释它,它会导致错误(见下文))

如果我没有显式创建联结表(没有其他数据),virtual 关键字会起作用,因为 EF 会按照约定创建联结表。

问题:

如何让学生访问类(class)而不通过注册?或者那是不可能的?如果不可能,那么最好的方法是什么?

(EF 和 C# 初学者)

    public class Student
{
[Key]
public int StudentId { get; set; }
public string StudentName { get; set; }

//public virtual Course Courses { get; set; }
}

public class Course
{
[Key]
public int CourseId { get; set; }
public string CourseName { get; set; }

//public virtual Student Students { get; set; }
}

public class Enrollment
{
[Key]
public int EnrollmentId { get; set; }
public Student Student { get; set; }
public Course Course { get; set; }
public string Grade { get; set; }
}

public class ManyMany : DbContext, IContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }

public void Run()
{
Database.SetInitializer(new DropCreateDatabaseAlways<ManyMany1>());
this.Courses.Add(new Course() {CourseName = "English"});
this.SaveChanges();
}
}

当我取消注释公共(public)虚拟......

错误:“无法确定‘EF.Course’和‘EF.Student’类型之间关联的主体端。必须使用关系流畅的 API 或数据注释。”

最佳答案

public class Student
{
public virtual int StudentId { get; set; }
public virtual string StudentName { get; set; }

public virtual ICollection<Enrollment> Enrollments { get; set; }
}

public class Course
{
public virtual int CourseId { get; set; }
public virtual string CourseName { get; set; }

public virtual ICollection<Enrollment> Enrollments { get; set; }
}

public class Enrollment
{
public virtual int StudentId { get; set; }
public virtual int CourseId { get; set; }
public virtual string Grade { get; set; }

public virtual Student Student { get; set; }
public virtual Course Course { get; set; }
}

public class ManyMany : DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasKey(student => student.StudentId);
modelBuilder.Entity<Course>()
.HasKey(course => course.CourseId);
modelBuilder.Entity<Enrollment>()
.HasKey(enrollment => new { enrollment.StudentId, enrollment.CourseId } );

modelBuilder.Entity<Student>()
.HasMany(student => student.Enrollments)
.WithRequired(enrollment => enrollment.Student)
.HasForeignKey(enrollment => enrollment.StudentId);
modelBuilder.Entity<Course>()
.HasMany(course => course.Enrollments)
.WithRequired(enrollment => enrollment.Course)
.HasForeignKey(enrollment => enrollment.CourseId);
}
}

关于此的较旧问题,答案和更多信息在这里:Entity Framework CodeFirst many to many relationship with additional information .

编辑:使用示例:

    var context = new ManyMany();

var physicsCourse = new Course() { CourseName = "Physics" };
var mathCourse = new Course() { CourseName = "Math" };

var studentJohn = new Student() { StudentName = "John Doe" };
var studentJane = new Student() { StudentName = "Jane Doe" };

var physicsCourseEnrollmentJohn = new Enrollment() { Student = studentJohn, Course = physicsCourse };
var mathCourseEnrollmentJohn = new Enrollment() { Student = studentJohn, Course = mathCourse };
var physicsCourseEnrollmentJane = new Enrollment() { Student = studentJane, Course = physicsCourse };

context.Courses.Add(physicsCourse);
context.Courses.Add(mathCourse);
context.Students.Add(studentJohn);
context.Students.Add(studentJane);

studentJohn.Enrollments.Add(physicsCourseEnrollmentJohn);
studentJohn.Enrollments.Add(mathCourseEnrollmentJohn);
studentJane.Enrollments.Add(physicsCourseEnrollmentJane);

physicsCourse.Enrollments.Add(physicsCourseEnrollmentJohn);
mathCourse.Enrollments.Add(mathCourseEnrollmentJohn);
physicsCourse.Enrollments.Add(physicsCourseEnrollmentJane);

context.Enrollments.Add(physicsCourseEnrollmentJohn);
context.Enrollments.Add(mathCourseEnrollmentJohn);
context.Enrollments.Add(physicsCourseEnrollmentJane);

context.SaveChanges();

var johnsEnrollments = context.Students.Where(student => student.StudentId == studentJohn.StudentId).Single().Enrollments;
MessageBox.Show(string.Format("Student John has enrolled in {0} courses.", johnsEnrollments.Count));
var janesEnrollments = context.Students.Where(student => student.StudentId == studentJane.StudentId).Single().Enrollments;
MessageBox.Show(string.Format("Student Jane has enrolled in {0} courses.", janesEnrollments.Count));

关于c# - Entity Framework Code First 中的多对多关系和使用 "virtual"关键字相互访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9959981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com