在我之前对数据进行存储库调用时,我从未遇到任何对db的更改没有反映的问题。但现在似乎正在发生这种情况。
之前,此类存储库调用始终位于使用存储库模式的上下文中,其中存储库i / fs被注入服务/控制器构造函数。
我有一个编写为控制台应用程序的电子邮件任务,其中包含一个while()循环,该循环询问数据库中的电子邮件帐户,然后从各自的服务器下载电子邮件。问题是,每次我调用_emailSettingsRepo.GetAll()方法时,所有设置都是旧的,并且不会显示对数据库的任何更改,即使我可以在管理工作室中看到更改。我猜这是因为我在循环中使用相同的repo使用相同的db上下文,因此调用GetAll()方法没有任何区别。
这是否意味着缓存之前从未出现过问题,因为每次新请求进入控制器时都会重新创建repo和db上下文?我如何解决这个问题?
答案 0 :(得分:1)
在需要时创建上下文并在之后进行处理,例如:
while (true)
{
using (var context = new MyContext())
{
_emailSettingsRepo = new EmailSettingsRepo(context);
var all = _emailSettingsRepo.GetAll();
// Process all
}
// context gets disposed here,
// garbage collection removes objects from context ("cache"),
// next run creates new "empty" context
bool cancelled = WaitAnHourOrCancel();
if (cancelled)
break;
}
将此控制台应用程序与关于上下文管理的Web应用程序进行比较,请认为每次循环运行都是Web请求。如果您在Web应用程序中使用IOC容器(例如Ninject),则容器很可能会创建上下文并为您配置它。但它总是一对context = new MyContext()
和context.Dispose()
以及两者之间的请求处理。因此,与上例中的using
块基本相同。您现在必须在控制台应用程序中明确地执行此操作。