我现在正在使用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
方法的完整性?
提前致谢
感谢任何帮助。
答案 0 :(得分:0)
只要“工作单元”占用,DataContext
就会存在。对于Web应用程序,这通常是单个HTTP请求。
您正在为正在完成的所有工作分享DataContext
。它不应该以这种方式使用。其中的实体不是缓存。它们对于保持DB状态和内存状态同步至关重要。
研究LINQ to SQL上下文中的工作单元意味着什么,并应用最佳实践。目前,您正在滥用框架,并且必须执行极端扭曲才能使其发挥作用。