在具有一对多关系的实体中同时插入数据

时间:2013-12-20 19:15:33

标签: c# asp.net-mvc entity-framework insert one-to-many

我有两个实体:学生和Enrollement有一对多的关系。 实体看起来像

public class Student{
 [Key]
 public int Studentid {get; set;}
 public string fname{get; set;}
 public string lname{get; set;}
 public virtual ICollection<Enrollement> Enrollement_E{ get; set; }
 }

 public class Enrollement{
 [Key]
 public int EnrolId {get; set;}

 [ForeignKey("Studentid ")]
 public int Student{get; set;}
 public string kk{get; set;}
 public virtual Student Student_E { get; set; }
 }

Studentid是一个自动增量主键,在注册表中用作外键。我试图将数据插入两个表。如果1失败,则两个插入都不应该提交。所以,我有以下代码。

try{
  repository.stu.insert(new student{fname = "fname", lname="lname"});
  repository.enr.insert(new Enrollement{student=???, kk="test"});
}
finally{
  repository.save();
}

如果未保存数据,我应该如何将外键传递给Enrollement记录。或者还有另一种方法吗?

3 个答案:

答案 0 :(得分:9)

不是分配外键,而是分配整个对象:

try{
  var student = new student(){fname = "fname", lname="lname"};
  repository.stu.insert(student);
  repository.enr.insert(new Enrollement(){Student_E = student});
}
finally{
  repository.save();
}

这种方式当student得到它的新密钥时,它将被自动保存到Enrollment中。

答案 1 :(得分:0)

您不需要单独保存这两个对象,您可以通过仅保存呼叫来实现此目的

public class Student{
 [Key]
 public int Studentid {get; set;}
 public string fname{get; set;}
 public string lname{get; set;}
 public virtual ICollection<Enrollement> Enrollement_E{ get; set; }
 }

 public class Enrollement{
 [Key]
 public int EnrolId {get; set;}
 [ForeignKey("Studentid ")]
 public int Student{get; set;}
 public string kk{get; set;}
 public virtual Student Student_E { get; set; }
 }

在连接的OnModelCreating方法中,定义关系,它将确保当你有Student对象时,它的相关或子对象,即Enrollements也将被保存

modelBuilder.Entity<Student>()
                .HasMany(c => c. Enrollement_E)
                .WithOne(e => e. Student_E);
modelBuilder.Entity<Enrollement>().Ignore(x => x. Student_E);

现在你的代码应该是这样的

try{
     student _student = new student{fname = "fname", lname="lname"};
     _student.Enrollement_E = new List< Enrollement>();
     _student.Enrollement_E.add(new Enrollement{student=???, kk="test"});
     repository.stu.insert(_student); 
}
finally
{
     repository.save();
}

这是使用Entity Framework Core完成的 最后一件事,遵循惯例,您还需要更改外键字段

public int Student{get; set;} to  public int StudentId{get; set;}

答案 2 :(得分:0)

Ef可以轻松处理外键,以将数据插入到多个相关表中。如果要同时在两个表中插入数据,则可以使用以下代码进行插入:

   student st = new student 
    {
      fname = "fname",
      lname= "lname",

      Enrollement_E=new List<Enrollement>
      {
        new Enrollement{kk="something"}
      }
    };

    repository.student.Add(st);
    repository.SaveChanges();

Ef本身为第二张表做外键