2013-03-11 42 views
0

我有一条是大干快上Application_Start播种演示数据到我的数据库运行的代码,但我发现了一个异常说:的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已超时,并迫使我的分贝范围内完成之前关闭其连接。

注:我知道代码,因为我在不同的地方使用它,它是单元测试,并在那里工作没有任何问题。

有什么想法可能是这里的问题?或我错过了什么?

+0

该错误通常意味着您正在访问某个对象中的一些延迟加载的属性,该对象在您处理上下文的地方从EF中提取。你确定异常是从你的SeedDemoData函数中抛出的吗? – Mikeb 2013-03-11 18:18:51

+0

您是否尝试过加入'ToList()'内查询'SeedDemoData()'只是为了确保上下文设置之前,你的查询叫什么名字? – Khan 2013-03-11 18:22:34

+0

是的,异常来自我的SeedDemoData(),我试图做的是将DB.ENTITY.SELECT(x => x.Id ==值)移动到执行中的第一行,它可以工作,但假如真有别的此之前我的上下文中执行它会吹,任何其他的想法? – 2013-03-11 19:25:44

回答

0

经过几个小时调查问题后,我发现它是由数据上下文在不同的线程上有挂起更改引起的。我们目前实施的数据库升级/迁移上的并行线程来我们App_Start方法运行,所以我注意到,我试图枚举实体正被改变的同时,即使他们正在不同的数据运行上下文EF被注意到,在访问实体返回不正确的错误消息,而实际的例外是实体状态被修改,但不保存在DataContext设置什么是错的。

我的问题的实际解决方案是将所有种子数据函数移动到数据库升级/迁移脚本,以便实体只在当时在一个位置进行修改。