Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不稳定的LINQ到SQL错误:“0”;在调用SubmitChanges期间无法执行操作。”;_C#_Linq To Sql_Datacontext_Submitchanges - Fatal编程技术网

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

C# 不稳定的LINQ到SQL错误:“0”;在调用SubmitChanges期间无法执行操作。”;,c#,linq-to-sql,datacontext,submitchanges,C#,Linq To Sql,Datacontext,Submitchanges,好的,我从这些行中得到了这个错误: System.Data.Linq.DataContext.CheckNotInSubmitChanges() +42 System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +54 我所做的是跟踪应用程序的状态并记录每个请求。该应用程序以Json、Xml和Html呈现输出 问题是错误是不稳定的。它只会每隔几个请求发生一次。当我开始执行Ajax请求时,错误开始发生。我已经

好的,我从这些行中得到了这个错误:

  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();
}
会话服务类所做的一切是,如果会话在db中且处于活动状态,则调用SqlXmlSessionStore.UpdateSession(会话);如果请求是新的且会话id丢失或唯一,则调用SqlXmlSessionStore.InsertSession(会话)

每次执行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;
     }

这似乎仍然是一种非常非常棘手的方法,我想弄清问题的根源,因此请告知是否有人知道如何解决此问题。

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


或者,重写SubmitChanges并记录stacktrace on ever调用以跟踪错误的原始原因。

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

编辑

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

我正在创建一个单独的 每次调用 服务

但是在第二部分你说

我尝试创建一个新的 每次我做一个 SubmitChanges(),但这导致 我没有连接对象

接下来我不明白的是,您修改过的方法只调用一次SubmitChanges,它是如何工作的,因为它会放弃在第一次调用后对数据所做的任何更改,它必须不记录所有数据,或者不需要在第一次调用后再调用SubmitChanges

Datacontext的实例方法不是线程安全的,您不能在应用程序启动时将其放入全局变量中(您正在这样做吗?);您通常希望每个HTTP请求都有一个新的Datacontext,您可以使用反转控制框架或仅在代码中这样做,在请求开始时更新Datacontext,并在结束时调用submit changes

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


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

从我的帖子中无法了解这一点,但我发现了问题所在。我在HttpModule中设置了依赖项注入,配置函数上有一个锁。我想它是从我第一次学习如何使用StructureMap时从某处复制(然后忘记)的旧代码中得到的。我把锁打开了,它工作了。(好吧,至少它开始产生新的、不相关的错误)


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

什么错误?你能发布例外文本吗?以及DataContext中使用()no的部分代码。两者都不是。有两种非常简单的情况:1)我创建一个新对象并插入SubmitSubmit,然后提交更改()2)我得到一个对象,更新它,然后提交更改()是私有的bool SubmitChanges()不在datacontext的分部类中?它在哪里?不,我有一个类,SqlXmlSessionStore,它包装了DataContext。私有bool SubmitChanges()在SqlXmlSessionStore中,并在上述代码中进行调用。@Christopher Edwards:您可以在调用基方法之前或之后更改SubmitChanges中的变更集。我有一个应用程序就是这样做的也许我读得不对。。。