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();