如何将多个模型保存到 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)的主要内容,如果未能解决你的问题,请参考以下文章

ef核心 - 如何将类映射的多个变体放到同一个表中

将多个选定的数据网格行保存到 EF 表

如何一次将数据插入和更新到 EF 多个表中

使用 EF 核心将多个关系数据添加到 SQL Server

C#console app与DB first Entity Framework和AutoMapper,无法将Model转换为DbModel

EF4 Code First + SQL Server CE:以原子方式保存双向引用