【问题标题】:.Net Entity objectcontext thread error.Net Entity objectcontext线程错误
【发布时间】:2010-05-24 22:31:39
【问题描述】:

我有一个 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,它在我的构造函数中实例化。我的猜测是阅读器仍然从“获取”功能打开并且没有关闭。如何关闭它?

在我的 UI 层中,我循环遍历结果并尝试像这样删除它们:

foreach(SourceKey sk in skm.Get(new SourceKey()))
{
    Debug.WriteLine(sk.sourceKey1);

    skm.Delete(sk);
}

编辑

此行出现错误:

_dataContext.DeleteObject(sk);

【问题讨论】:

    标签: .net entity-framework multithreading savechanges objectcontext


    【解决方案1】:

    我怀疑这与 Linq 处理查询有关。我根据我过去读过的文章猜测,但我认为您的查询是延迟执行的 - 查询是从第一次使用枚举器的点(第一个 MoveNext 调用)开始打开的,并且不是t 关闭直到枚举完成。

    如果您可以控制枚举,则可以确保枚举器完成并查看是否有任何区别。或者,更有可能的是,某处的配置可能控制查询的运行方式,但这超出了我所看到的范围。

    【讨论】:

    • 据我了解,查询将在 AsEnumerable() 上执行。我确实从我的 foreach 循环中删除了它并且它起作用了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多