清除LINQ Cache和DataContext的问题

时间:2014-02-26 21:51:20

标签: c# sql-server caching linq-to-sql

我现在正在使用Visual Studio 2008和MSSQL Server 2005开发的使用N-Tier架构设计的大型项目中工作。在项目中使用了使用Unity的依赖注入的存储库模式。

第一个问题出现在数据库中插入,更新等操作的瞬间数据未插入或更新的时刻,不得不关闭应用程序重新打开以查看新数据。

经过长时间的阅读后发现问题是没有正确清理的LINQ Cache。我们解决了在类中插入所有实体实现以下方法的问题:

public void ClearCache()
{
   DataContextFactory.GetDataContextInstance(true);
   Context.Log = Console.Out;
}

这是DataContextFactory类:

public static class DataContextFactory
{
    public static PromedDataContext Context;

    public static PromedDataContext GetDataContextInstance(bool recreate)
    {
        return Context != null && !recreate ? Context : (Context = new PromedDataContext(GlobalAttributesProvider.DbConnectionPath));
    }
}

解决方法是在调用上面的ClearCache方法后,每次插入或更新值时创建DataContext的新实例。

问题是,一段时间后这个解决方案有效,但是当我尝试在数据库中插入数据时,片刻开始出现另一个问题。错误如下:

We attempted to attach or add an entity that is not new. Perhaps he had loaded another DataContext element. This operation is not supported.

在阅读了一段时间后出现此错误,我解决了只是评论ClearCache方法的主体,因为这创建了DataContext的多个实例,当然这打破了我对缓存的解决方案件。

我的问题是:

还有另一种方法可以清除上面提到的缓存,避免上述错误吗? 或者修复上述错误,保留ClearCache方法的完整性?

提前致谢

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

只要“工作单元”占用,DataContext就会存在。对于Web应用程序,这通常是单个HTTP请求。

您正在为正在完成的所有工作分享DataContext。它不应该以这种方式使用。其中的实体不是缓存。它们对于保持DB状态和内存状态同步至关重要。

研究LINQ to SQL上下文中的工作单元意味着什么,并应用最佳实践。目前,您正在滥用框架,并且必须执行极端扭曲才能使其发挥作用。