我有两个实体:学生和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记录。或者还有另一种方法吗?
答案 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本身为第二张表做外键