.Net实体objectcontext线程错误
我有一个n层asp.net应用程序,它将一个对象从我的DAL返回到BAL,如下所示:.Net实体objectcontext线程错误,.net,entity-framework,multithreading,savechanges,objectcontext,.net,Entity Framework,Multithreading,Savechanges,Objectcontext,我有一个n层asp.net应用程序,它将一个对象从我的DAL返回到BAL,如下所示: public IEnumerable<SourceKey> Get(SourceKey sk) { var query = from SourceKey in _dataContext.SourceKeys select SourceKey; if (sk.sourceKey1 != null) { query = from
public IEnumerable<SourceKey> Get(SourceKey sk)
{
var query = from SourceKey in _dataContext.SourceKeys
select SourceKey;
if (sk.sourceKey1 != null)
{
query = from SourceKey in query
where SourceKey.sourceKey1 == sk.sourceKey1
select SourceKey;
}
return query.AsEnumerable();
}
在调用“Get”函数后尝试调用“Delete”时,收到以下错误:
不允许新事务处理,因为
中还有其他线程在运行
会议
这是一个ASP.Net应用程序。我的DAL包含一个实体数据模型。我在其中拥有上述函数的类共享相同的_dataContext,它在我的构造函数中实例化。我的猜测是,阅读器仍然从“Get”函数打开,并且没有关闭。我怎样才能关上它
在我的UI层中,我循环浏览结果并尝试删除它们,如下所示:
foreach(SourceKey sk in skm.Get(new SourceKey()))
{
Debug.WriteLine(sk.sourceKey1);
skm.Delete(sk);
}
编辑
此行出现错误:
_dataContext.DeleteObject(sk);
我怀疑这与Linq处理查询有关。我是根据我过去读过的文章来猜测的,但我认为您的查询是延迟执行的-查询是从第一次使用枚举数的点(第一次
MoveNext
调用)开始打开的,直到枚举完成才关闭
如果您控制枚举,则可以确保枚举器已完成,并查看这是否有任何区别。或者,更可能的是,某个地方的配置可能会控制查询的运行方式,但这超出了我所看到的范围。据我所知,查询将在AsEnumerable()上执行。我确实将delete从foreach循环中删除了,并且成功了
_dataContext.DeleteObject(sk);