【问题标题】:Application_Start timeout?Application_Start 超时?
【发布时间】:2013-03-11 18:13:08
【问题描述】:

我有一段代码可以在 Application_Start 上运行,用于将演示数据播种到我的数据库中,但我收到一个异常消息:

ObjectContext 实例已被释放,不能再用于需要连接的操作

在尝试枚举我的一个实体时 DB.ENTITY.SELECT(x => x.Id == value);

我已经检查了我的代码,并且在我的操作之前我没有处理我的上下文,下面是我当前实现的概要:

protected void Application_Start()
{
   SeedDemoData();
}

public static void SeedDemoData()
{
   using(var context = new DBContext())
   {
       // my code is run here.
   }
}

所以我想知道Application_Start 是否超时并强制我的数据库上下文在完成之前关闭其连接。

注意:我知道代码是因为我在不同的地方使用它,而且它已经过单元测试,在那里它可以正常工作。

对这里可能出现的问题有任何想法吗?还是我错过了什么?

【问题讨论】:

  • 该错误通常意味着您正在访问从 EF 获取的对象中的某些延迟加载属性,该对象位于上下文被处理的位置。您确定您的 SeedDemoData 函数引发了异常吗?
  • 您是否尝试将ToList() 添加到SeedDemoData() 内的查询中,以确保在释放上下文之前调用您的查询?
  • 是的,异常来自我的 SeedDemoData(),我试图做的是将 DB.ENTITY.SELECT(x => x.Id == value) 移动到第一行执行并且它有效,但是如果在此之前在我的上下文中执行任何其他操作,它会爆炸,还有其他想法吗?

标签: asp.net entity-framework asp.net-mvc-4 global-asax


【解决方案1】:

在调查了这个问题几个小时后,我发现它是由数据上下文在不同的线程上有待处理的更改引起的。我们当前的数据库升级/迁移实现在 App_Start 方法的并行线程上运行,因此我注意到我尝试枚举的实体同时被更改,即使它们在不同的数据上下文中运行 EF 注意到访问实体时出现问题并返回不正确的错误消息,说明数据上下文已被释放,而实际异常是实体状态已修改但未保存。

我的问题的实际解决方案是将所有种子数据功能移动到数据库升级/迁移脚本中,这样实体一次只在一个地方修改。

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 2011-10-28
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多