从缓存或旧数据库中提取数据

本文关键字:提取 数据 数据库 缓存 | 更新日期: 2023-09-27 18:18:10

我有一个c# mvc3应用程序,它使用实体框架从我的SQL服务器数据库中提取数据。我发现它似乎在拉"旧的"或"缓存的"数据,而不是当前在DB中的数据。

一旦我更新了模型,它似乎就会拉出新的数据。

我的问题是我如何确保我总是从数据库中提取"实时"数据,而不是得到"缓存"或"旧"数据?

当我运行以下代码并检查tblcompanyinfo.companyname的值时,它返回的是一个旧的公司名称(与数据库中当前的名称不同)。

当我更新模型并重新运行它时,它返回了公司名称的当前值。

private static ApptReminderEntities db = new ApptReminderEntities();
tblCompanyInfo tblcompanyinfo = db.tblCompanyInfoes.SingleOrDefault(t => (t.CompanyID == lCompanyID));

谢谢!

从缓存或旧数据库中提取数据

这可能是由于您的共享和静态DbContext Instance,即

private static ApptReminderEntities db = new ApptReminderEntities();

用using block代替

using(ApptReminderEntities db = new ApptReminderEntities())
{
  tblCompanyInfo tblcompanyinfo = db.tblCompanyInfoes
                              .SingleOrDefault(t => (t.CompanyID == lCompanyID));
}

使用using语句,您是

  • 每次创建新的ApptReminderEntities实例。
  • 使用将自动关闭并处置您的实例。

因此,对于每次访问数据库,使用using,以便每次创建上下文的新实例。

问题是您没有为每个查询创建新的上下文-您已经将其定义为静态。

您应该始终为您在数据库上执行的每个操作创建一个新的ApptReminderEntities

您可以使用存储库模式或类似的模式。在我的例子中,我要做的每个操作

var employees = new EmployeeRepository().GetEmployees();

,在Employee存储库构造函数中,它创建了一个new EmployeeEntities()

这也使得单元测试非常容易,因为我可以重载存储库并在虚拟上下文中传递。