【发布时间】:2013-10-24 23:22:04
【问题描述】:
所以我有一个类似于下面的类。有一个线程使用 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
}
}
【问题讨论】:
-
AppDomain 中缓存的唯一内容是 EF 模型(存储模型、概念模型和映射),而不是数据。这真的取决于你在循环中做了什么。能再多介绍一点吗?
-
这就是我读过并想到的,但我肯定得到过时/缓存的数据。我发布了我认为正在发生的事情的答案。
-
我猜你每次在调用 ProcessingStepOne 或 ProcessingStepTwo 之前调用 Threadloop 是为了获得一个新的 m_DB 上下文来使用?
-
您的示例中省略了线程详细信息,但我想知道您是否在 m_DB 的每次读/写周围都有一个 lock()。这将解释为什么旧的上下文可能会出现跳转线程。此外,由于 EF 根据定义不是线程安全的,因此几乎没有理由跨线程传递上下文。
-
我也看到过同样的事情发生,但不能 100% 确定。这是在 linux 机器上运行的 .NET Core(但与 SQL 服务器通信)。
标签: c# entity-framework