实体框架DbContext如何将记录加载到内存中

本文关键字:加载 内存 记录 框架 DbContext 实体 | 更新日期: 2023-09-27 18:28:47

我使用的是实体框架6和DbContext。我想从数据库中急切地加载记录,以便在循环中使用这些记录。我想用例子来解释(这只是一个例子,请不要说我在现实世界中这是不现实的)。

我有一个显示学生名单的DataGridView。在Student表中,每条记录都有一列favorite_subject_id

当在DataGridView中显示每个学生记录时,我想从Subject表中找到并显示科目名称和学生的favorite_subject_id(假设它们之间没有数据库关系。我知道它应该在现实世界中的项目中。但这只是一个澄清我问题的例子。)

作为第一个,我将这个概念开发为以下代码:

foreach (DataGridViewRow row in gridView.Rows)  
{    
    if (!row.IsNewRow)    
    {      
        var student = (Student)(row.DataBoundItem);
        var favorite_subject = dbContext.Subjects.find(student.favorite_subject_id);
        row.Cells[colFs.Index].Value = favorite_subject.subject_name.ToString();
    }  
}

但是这个代码实现将触及每个学生记录的数据库。它会损坏性能。

所以我想在循环之前将主题记录加载到内存中。在循环中,我只想从内存中这些急切加载的记录中进行搜索。问题是,我不知道将记录加载到内存中的正确(最佳)方式是什么。

我为此写了一些代码。但我不确定这样做是否正确

var lstSubjects = dbContext.Subjects.ToList<Subject>();
foreach (DataGridViewRow row in gridView.Rows)  
{    
    if (!row.IsNewRow)    
    {      
        var student = (Student)(row.DataBoundItem);
        var favorite_subject= lstSubjects .Find(x => x.subject_id == student.favorite_subject_id);
        row.Cells[colFs.Index].Value = favorite_subject.subject_name.ToString();
    }  
}

因此,问题是,将记录从数据库加载到内存(使用DbContext)的最佳方式是什么?

实体框架DbContext如何将记录加载到内存中

您可以使用Include进行急切加载,但只有当这些表之间存在数据库关系时,才能执行此操作。在这种情况下,您可以使用以下代码。

dbContext.Students.Include(x=>x.Subjects)

假设您有对应于student表的DbSet Students和Students DbSet中表示关系的Subjects导航属性。

这将加载所有学生以及与他们相关的所有科目。