代码之家  ›  专栏  ›  技术社区  ›  smartcaveman

不稳定的LINQ到SQL错误:“调用SubmitChanges期间无法执行操作。”

  •  0
  • smartcaveman  · 技术社区  · 14 年前

    好吧,我从线路上得到这个错误:

      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();
    }
    

    每次执行SubmitChanges()时,我都尝试创建DataContext的新实例,但这导致我没有连接对象,即使从设置中提取相同的连接字符串也是如此。这可能和我的本地机器有关吗?

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

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

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

    这看起来仍然是一个非常老套的工作方式,我想得到问题的底部,所以请告诉如果有人有任何想法,如何解决这个问题。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Christopher Edwards    14 年前

    不能更改SubmitChanges内部的更改集,也不能在分部类的重写方法中调用SubmitChanges。我怀疑你在做这件事,但我没有完全按照你的代码片段来做。

    编辑

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

    我正在创建一个 服务

    我试图创建 每次我做一个 SubmitChanges(),但这导致

    下一件我不明白的事情是,你的修改过的方法调用SubmitChanges只工作一次,因为它会丢弃在第一次调用后对数据所做的任何更改它必须不记录你的所有数据,或者不需要在第一次调用提交更改后进行任何调用。

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

    如果您能构造一个最小的示例并发布整个代码,那将是很好的。

        2
  •  1
  •   smartcaveman    14 年前

    哦,它之所以影响我的DataContext是因为包装DataContext实例的类在锁中。

        3
  •  0
  •   leppie    14 年前

    我建议您附加一个调试器,并在act中捕获异常。从那里你应该可以追踪它是从哪里来的。

    SubmitChanges 并将stacktrace记录在ever调用中,以跟踪错误的源代码。