代码之家  ›  专栏  ›  技术社区  ›  Chris Klepeis

.NET实体对象上下文线程错误

  •  0
  • Chris Klepeis  · 技术社区  · 16 年前

    我有一个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 SourceKey in query
                    where SourceKey.sourceKey1 == sk.sourceKey1
                    select SourceKey;
        }
    
        return query.AsEnumerable();
    }
    

    此结果将通过我的业务层并点击UI层以显示给最终用户。我不延迟加载以防止在应用程序的其他层中执行查询。

    我在DAL中创建了另一个函数来删除对象:

    public void Delete(SourceKey sk)
    {
        try
        {
            _dataContext.DeleteObject(sk);
            _dataContext.SaveChanges();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message + " " + ex.StackTrace + " " + ex.InnerException);
        }
    }
    

    当我在调用“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);
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Dan Puzey    16 年前

    我怀疑这与Linq处理查询有关。我是根据我以前读过的文章来猜测的,但是我认为你的查询执行得很慢——查询是从枚举器第一次使用的时候开始打开的(第一个 MoveNext 调用),并且在枚举完成之前不会关闭。

    如果您控制枚举,那么可以确保枚举器完成,并查看这是否会产生任何影响。或者,更可能的是,有一些配置可以控制查询的运行方式,但这已经超出了我所看到的范围。