如何将多个模型保存到 Db Context (EF)
Posted
技术标签:
【中文标题】如何将多个模型保存到 Db Context (EF)【英文标题】:How to save multiple model to Db Context (EF) 【发布时间】:2015-11-20 05:28:34 【问题描述】:我一直在将我的模型保存在 Db Context 上,我不确定从哪里开始或如何继续。
我有 3 个模型(这是条形版本,便于阅读)
public class Student
[Required]
public int Id get; set;
public virtual List<SyTerm> SyTerm get; set;
public class SyTerm
[Required]
public int Id get; set;
public virtual List<Course> Courses get; set;
public class Course
[Required]
public int Id get; set;
我的问题是当我尝试使用实体框架保存它时
db.Courses.Add(cortemp1);
db.Courses.Add(cortemp2);
db.Students.Add(stud);
...
db.SaveChanges();
我总是收到错误(各种错误,如冲突等) 我不确定如何保存它的正确顺序。
例如我有这个
var stud = new Student();
var sys = new List<SyTerm>();
var cours = new List<Course>();
var sytemp1 = new SyTerm();
var sytemp2 = new SyTerm();
var cortemp1 = new Course();
var cortemp2 = new Course();
我应该如何对其进行排序以将其保存在我的 Db 中?
【问题讨论】:
【参考方案1】:首先,如果您以正确的方式建立实体关系,则不需要多次保存更改,因此请执行以下操作
var stud = new Student();
var sys = new List<SyTerm>();
var cours = new List<Course>();
var sytemp1 = new SyTerm();
var sytemp2 = new SyTerm();
sys.Add(sytemp1);//add data to collection
var cortemp1 = new Course();
var cortemp2 = new Course();
stud.SysTerm = sys;// here we are saying that student entity has this collection
dbCtx.Student.add(stud); // just add student
dbCtx.SaveChanges()
简单来说,将所有对象添加到学生,然后添加并保存更改,因为学生现在是一个完整的实体。有关确切的样本,请查看 http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx
【讨论】:
有效吗?我的意思是在这种情况下,我假设程序会自动将 SyTerm 的数据添加到数据库中 @FranzJustinBuenaventura,是的,它是一个完整的实体,如果您定义了适当的关系,则不必显式保存子实体 @FranzJustinBuenaventura 我同意 Anshul Nigam 的观点,即您应该为关系分配值 - EF 自己无法弄清楚,您希望为该特定对象添加它 @FranzJustinBuenaventura,看看entityframeworktutorial.net/code-first/… 我从来不知道 EF 有这个功能。它比我预期的要聪明【参考方案2】:我认为你应该在 Course 和 SyTerm 之间建立关系,所以你的 Course 应该是这样的:
public class Course
[Required]
public int Id get; set;
public virtual SyTerm get; set;
当然,如果需要,你必须初始化它
【讨论】:
是多余的吗?我的原始模型就是这样,除了让 SyTerm 有一个虚拟学生。【参考方案3】:在添加/更新实体框架实体时,您必须确保考虑到数据库外键关系并正确映射它。在您的情况下,SysTerm 有课程列表,但课程也应该有一个 SysTerm Id 属性,以确保保持正确的一对多关系。下图示例如何正确创建实体关系
public class Student
public Student()
public int StudentID get; set;
public string StudentName get; set;
//Foreign key for Standard
public int StandardRefId get; set;
[ForeignKey("StandardRefId")]
public Standard Standard get; set;
public class Standard
public Standard()
public int StandardId get; set;
public string StandardName get; set;
public ICollection<Student> Students get; set;
请查看此答案以获取更多详细信息:Understanding ForeignKey attribute in entity framework code first
【讨论】:
我认为 public virtual 可以替代手动声明外键 仅仅将属性标记为虚拟对您没有帮助。您仍然需要指定参考。 ***.com/questions/21856218/…以上是关于如何将多个模型保存到 Db Context (EF)的主要内容,如果未能解决你的问题,请参考以下文章
C#console app与DB first Entity Framework和AutoMapper,无法将Model转换为DbModel