1

(使用实体框架4.3代码优先)
如何在连接表有额外数据(有效载荷)时添加实体?

代码如下。我想实际上能够做到这样的事情:

var instanceStudent = new Student2(){...}; 
var instanceCourse = new Course2(){...}; 
instanceStudent.Add(instanceCourse); 
db.SaveChanges(); 

......或类似的东西,只要它工作。基本上,我目前是Entity Framework的noob,我希望能够知道如何在另一个实体中添加实体,而Junction表中有数据(我知道在交界表上很容易, m难倒了)

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

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

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

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

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

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

    public class ManyMany2 : DbContext, IContext 
    { 
     public DbSet<Student2> Students { get; set; } 
     public DbSet<Course2> Courses { get; set; } 
     public DbSet<Enrollment2> Enrollments { get; set; } 

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

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

     public void Run() 
     { 
      Database.SetInitializer(new DropCreateDatabaseAlways<ManyMany2>()); 

      var c1 = new Course2() { CourseName = "Spanish" }; 
      var c2 = new Course2() { CourseName = "Science" }; 
      var c3 = new Course2() { CourseName = "History" }; 

      var s1 = new Student2() { StudentName = "JC" }; 
      var s2 = new Student2() { StudentName = "Joe" }; 
      var s3 = new Student2() { StudentName = "Jill" }; 
     } 
    } 
+0

是Enrollment2.Grade必填字段? – 2012-04-01 04:00:57

+0

这不是一个真实世界的项目,只是我尝试EF代码第一,但我很难过...如果“需要”在验证要求?没有。 – 2012-04-01 04:04:16

+0

因为它不是可以空的。 – 2012-04-01 04:06:14

回答

2

如果连接表有负载,实体框架不支持直接的多对多关联。这意味着你必须做这样的事情:

var instanceStudent = new Student2(){...};  
var instanceCourse = new Course2(){...}; 
var instanceEnrollment = new Enrollment2() 
     { Course = instanceCourse, Student = instanceStudent }; 
db.Enrollments.Add(instanceEnrollment); 
db.SaveChanges(); 

你也可以做(或类似与课程)如下:

var instanceStudent = new Student2(){...}; 
var instanceCourse = new Course2(){...}; 
instanceStudent.Enrollments = new Enrollment2() { Course = instanceCourse }; 
db.Students.Add(instanceStudent); 
db.SaveChanges();