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中的变更集。我有一个应用程序就是这样做的也许我读得不对。。。