0

好的,所以我从以下几行中得到了这个错误:

  System.Data.Linq.DataContext.CheckNotInSubmitChanges() +42
  System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +54

我正在做的是跟踪应用程序的状态并记录每个请求。该应用程序以 Json、Xml 和 Html 格式呈现输出。

问题是错误是不稳定的。它只会每隔几个请求发生一次。当我开始执行 Ajax 请求时,错误开始发生。我已经能够确定错误在快速请求时更频繁地发生(即,如果我反复单击链接)。

每次调用引发错误的服务时,我都会创建一个单独的 DataContext 实例。我很难弄清楚这里的问题是什么,我非常感谢任何关于正在发生的事情的指导和/或解释。谢谢你。

* 编辑 : **

 [InvalidOperationException: The operation cannot be performed during a call to SubmitChanges.]
    System.Data.Linq.DataContext.CheckNotInSubmitChanges() +80
    System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +73
    Magic.Model.Sessions.SqlXmlSessionStore.SubmitChanges() in SqlXmlSessionStore.cs:17
    Magic.Model.Sessions.SqlXmlSessionStore.UpdateSession(Session session) in SqlXmlSessionStore.cs:64
    Magic.Web.SessionService.OpenSession(MagicRequestContext requestContext) in SessionService.cs:36
    Magic.Web.SessionService.Magic.Model.Sessions.ISessionService.OpenSession(IRequestContext requestContext) in SessionService.cs:23

提到的方法有:

private bool SubmitChanges()
{
   _sqlContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
   return _sqlContext.ChangeConflicts.Count == 0;   
}

public bool UpdateSession(Session session)
{
   var record = _sqlContext.SessionRecords.Single(x => x.SessionId == session.Key);
   _converter.PopulateRecordData(session, record);
   return SubmitChanges();
}

如果会话在数据库中并且处于活动状态,则会话服务类所做的所有事情都是调用 SqlXmlSessionStore.UpdateSession(session),如果请求是新的并且会话 ID 丢失或唯一,则调用 SqlXmlSessionStore.InsertSession(session)。

每次执行 SubmitChanges() 时,我都尝试创建 DataContext 的新实例,但这导致我没有 Connection 对象,即使我拉同一个 conn。设置中的字符串。这可能与我的本地机器有关吗?

好的,所以我做了一些有效的事情,但我不确定这是否会出现我没有预见到的问题。

我只允许 DataContext 提交一次。我通过将 SubmitChanges() 代码更改为:

    private bool _canSubmit = true;

    bool SubmitChanges(){
        if(_canSubmit)
        {
            _sqlContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
            _canSubmit = false;
            return _sqlContext.ChangeConflicts.Count == 0;      
        }
        return false;
     }

这似乎仍然是一种非常非常hacky的方式,我想深入了解问题的根源,所以请告知是否有人知道如何解决这个问题。

4

3 回答 3

1

您不能更改 SubmitChanges 内部的更改集,也不能在部分类的重写方法中调用 SubmitChanges。我怀疑你正在这样做,但我并不完全遵循你的代码片段。

编辑

我不明白如何管理 DataContext 的生命周期。在你说的问题的第一部分

每次调用服务时,我都会创建一个单独的 DataContext 实例

但在第二部分你说

每次执行 SubmitChanges() 时,我都尝试创建 DataContext 的新实例,但这导致我没有 Connection 对象

我不明白的下一件事是您更改后的仅调用一次 SubmitChanges 的方法是如何工作的,因为它会丢弃第一次调用后对数据所做的任何更改,它必须要么不记录所有数据,要么在第一次调用后不记录任何调用不需要提交更改。

Datacontext 的实例方法不是线程安全的,你不能在应用程序启动时将它放在全局变量中(你在这样做吗?);您通常希望每个 HTTP 请求都有一个新的 Datacontext,您可以使用控制反转框架或仅在代码中执行此操作,在请求开始时新建 dataconext 并在结束时调用提交更改。

另一种技术是使用多个DataContext,创建datacontext,进行更改,调用submit chnages,丢弃DataContext,它非常轻量级。您通常不需要多次调用提交更改,我这样做的唯一一次是控制 SQL 语句的执行顺序。

如果您可以构建一个最小的示例并发布整个代码,那就太好了。

于 2010-11-02T20:27:55.107 回答
1

从我的帖子中无法知道这一点,但我发现了问题。我在一个 HttpModule 中设置了依赖注入,并且在配置函数上有一个锁。我认为它来自我第一次学习如何使用 StructureMap 时从某个地方复制(然后忘记)的旧代码。我取下了锁,它起作用了。(好吧,至少它开始产生新的、不相关的错误)。

哦,它影响我的 DataContext 的原因是因为包装 Datacontext 实例的类在锁内。

于 2010-11-05T06:41:43.920 回答
0

我建议您附加一个调试器并在该行为中捕获异常。从那里你应该能够追踪它的来源。

或者,SubmitChanges在任何调用时覆盖并记录堆栈跟踪,以追踪错误的来源。

于 2010-11-02T06:35:59.327 回答