如何使用Entity Framework确保存储库调用不会被缓存?

时间:2011-12-21 16:09:14

标签: entity-framework repository

在我之前对数据进行存储库调用时,我从未遇到任何对db的更改没有反映的问题。但现在似乎正在发生这种情况。

之前,此类存储库调用始终位于使用存储库模式的上下文中,其中存储库i / fs被注入服务/控制器构造函数。

我有一个编写为控制台应用程序的电子邮件任务,其中包含一个while()循环,该循环询问数据库中的电子邮件帐户,然后从各自的服务器下载电子邮件。问题是,每次我调用_emailSettingsRepo.GetAll()方法时,所有设置都是旧的,并且不会显示对数据库的任何更改,即使我可以在管理工作室中看到更改。我猜这是因为我在循环中使用相同的repo使用相同的db上下文,因此调用GetAll()方法没有任何区别。

这是否意味着缓存之前从未出现过问题,因为每次新请求进入控制器时都会重新创建repo和db上下文?我如何解决这个问题?

1 个答案:

答案 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块基本相同。您现在必须在控制台应用程序中明确地执行此操作。