Как добавить сущности, когда в соединительной таблице есть дополнительные данные (полезная нагрузка)? - PullRequest
1 голос
/ 01 апреля 2012

(ИСПОЛЬЗОВАНИЕ РАМКИ ENTITY 4.3 КОДА ПЕРВЫМ)

Код ниже. Я действительно хочу сделать что-то вроде:

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

... или что-то в этом роде, пока это работает. По сути, я в настоящее время являюсь новичком в Entity Framework, и я хочу иметь возможность узнать, как добавить сущность в другую сущность, в то время как в таблице Junction есть данные (я знаю, что это легко для пустой таблицы соединений , но я поставлен в тупик на этом)

    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" };
        }
    }

1 Ответ

2 голосов
/ 01 апреля 2012

Entity Framework не поддерживает прямые связи «многие ко многим», если таблица соединения имеет полезную нагрузку. Это означает, что вы должны сделать что-то вроде этого:

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