从缓存或旧数据库中提取数据
本文关键字:提取 数据 数据库 缓存 | 更新日期: 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()
这也使得单元测试非常容易,因为我可以重载存储库并在虚拟上下文中传递。