【问题标题】:How to add entities when join table has extra data (payload)?连接表有额外数据(有效负载)时如何添加实体?
【发布时间】:2012-04-01 03:37:27
【问题描述】:

(首先使用实体​​框架 4.3 代码)

代码如下。我实际上希望能够执行以下操作:

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

...或类似的东西,只要它有效。基本上,我目前是 Entity Framework 的菜鸟,我希望能够知道如何在 Junction 表中有数据时在另一个实体中添加实体(我知道在 empty 连接上很容易表,但我被这个难倒了)

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

【问题讨论】:

  • Enrollment2.Grade 是必填字段吗?
  • 这不是一个真实世界的项目,只是我尝试 EF Code First 但我很难过......如果“需要”作为验证要求?没有。
  • 请不要在您的代码前加上实体框架。这就是标签的用途
  • @MystereMan 我只是好奇你为什么这么问?
  • @JanCarloViray - 因为我想知道在创建 Enrollment2 实例时是否需要提供 Grade。

标签: c# entity-framework ef-code-first many-to-many entity-framework-4.3


【解决方案1】:

如果连接表有负载,实体框架不支持直接多对多关联。这意味着您必须执行以下操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 2020-08-15
    • 2011-01-20
    • 2012-02-27
    • 2011-09-30
    • 2021-07-09
    • 2017-05-26
    • 2020-06-20
    相关资源
    最近更新 更多