使用Repository Pattern返回IQueryable数据时刷新DataContext

时间:2012-02-21 15:02:47

标签: asp.net-mvc-3 linq-to-sql caching lazy-loading

我对Web应用程序中的缓存数据存在一个孤立的问题,并且由于重复使用datacontext的方式而了解它是否已缓存。我的Repository类返回IQueryable类型,所以我无法通过关闭&来刷新datacontext。重新打开它。例如,我的CustomerRepository有这个datacontext构造函数:

private CAClassesDataContext context = new CAClassesDataContext();

然后所有数据库交互方法都使用此上下文,例如:

public IQueryable<Customer> Customers
{
     get { return context.Customers; }
}

如果我尝试在using块中使用上下文:

using(CAClassesDataContext context = new CAClassesDataContext())
{
...
}

我无法访问相关的类,因为使用了延迟加载。我试过添加:

context.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customer)
更新后

但问题仍然存在。如何强制LINQ to SQL使用数据库数据而不是缓存?

更新: 感谢史蒂夫和他提供的答案。安德鲁我能够解决这个问题。我的存储库现在有一个像这样的构造函数:

[Inject]
public CustomerRepository (CAClassesDataContext Context)
{
    context = Context;
}

在我的Ninject绑定中添加了:

Bind<CAClassesDataContext>().ToSelf().InRequestScope();

我的项目使用自定义成员资格提供程序,由于提供程序的无参数构造函数,我无法使用上述技术。为了解决这个问题,我向存储库添加了一些方法,这些方法在&amp;之前被调用。在数据库查找之后:

repository.CreateContext();
var cust = repository.GetAllCustomers().SingleOrDefault(c => c.Username == username);
repository.DisposeContext();

2 个答案:

答案 0 :(得分:1)

数据上下文应仅存在于“工作单元”中。听起来你错误地使用你的DC并保持它(或存储库类)闲置的时间超过它应该的时间。

每次BLL需要执行一系列数据库操作时尝试实例化存储库,并在完成后处理它。或者这是不实际的(例如,如果您使用IoC将存储库实例注入BLL),那么可能会向存储库添加一个方法,以允许BLL在启动工作单元之前启动DC,以及另一种方法之后处理它。

答案 1 :(得分:0)

正如@Andrew Stephens所说,应该基于每个请求创建和使用您的上下文对象。

不是将其硬编码为在存储库中创建,而是通过其构造函数将其注入存储库。如果您正在使用IoC容器,您可以根据需要为每个请求管理上下文(例如,Ninject提供此功能),否则您可以使用请求范围的数据存储对象将上下文包装起来HttpContext.Items,详见this article