所以我有一个类似下面的类。有一个线程使用Entity Framework Code First DbContext做了一些工作。
我遇到的问题是m_DB上下文似乎是缓存数据,即使它应该为每个处理循环进行处理和重新创建。
我所看到的是,加载的模型中没有关系中的某些数据。如果我突然杀死并重新启动进程,就会发现数据应该是这样的。
我唯一能想到的是这个应用程序在数据库连接字符串中使用MultipleActiveResultSets = true,但是我找不到任何明确说明这会导致我看到的行为。
任何见解都将受到赞赏。
public class ProcessingService
{
private MyContext m_DB = null
private bool m_Run = true;
private void ThreadLoop()
{
while(m_Run)
{
try
{
if(m_DB == null)
m_DB = new MyContext();
}
catch(Exception ex)
{
//Log Error
}
finally
{
if(m_DB != null)
{
m_DB.Dispose();
m_DB = null;
}
}
}
}
private void ProcessingStepOne()
{
// Do some work with m_DB
}
private void ProcessingStepTwo()
{
// Do some work with m_DB
}
}
答案 0 :(得分:3)
多个活动结果集或MARS是SQL 2005/2008和ADO.NET的一项功能,其中一个连接可以由多个活动结果集使用(顾名思义)。尝试在连接字符串上关闭它并观察应用程序的行为,我猜这可能是你的问题的可能原因。有关MARS的更多信息,请阅读以下MSDN链接
MSDN - Multiple Active Result Sets
编辑: 尝试:
var results = context.SomeEntitiy.AsNoTracking() where this = that select s;
AsNoTracking()关闭实体的内部更改跟踪,它还应强制实体框架每次重新加载实体。
无论做了什么和做了什么,你都需要进行一些重新分解,因为你的代码中显然存在设计缺陷。
答案 1 :(得分:2)
我讨厌回答我自己的问题,特别是当我没有很好地解释为什么它能解决这个问题时。
我最终删除了MARS,它确实解决了我的问题。我的最佳解释是:
无论是否返回结果,始终读取结果请求的结尾,以及返回多个结果的批次。 (http://technet.microsoft.com/en-us/library/ms131686.aspx)
我的应用程序并不总是读取返回的所有结果,因此我的理论认为这有些导致数据被缓存并重新使用新的DbContext
。