实体框架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
)的最佳方式是什么?
您可以使用Include进行急切加载,但只有当这些表之间存在数据库关系时,才能执行此操作。在这种情况下,您可以使用以下代码。
dbContext.Students.Include(x=>x.Subjects)
假设您有对应于student表的DbSet Students和Students DbSet中表示关系的Subjects导航属性。
这将加载所有学生以及与他们相关的所有科目。