gpt4 book ai didi

c# - LinQ DataContext - 在调用 SubmitChanges 期间无法执行该操作

转载 作者:行者123 更新时间:2023-11-30 15:05:56 25 4
gpt4 key购买 nike

抛出异常的代码非常简单 - 这是非常常规的插入然后提交更改语句,如下所示:

context.tb_dayErrorLog.InsertOnSubmit(data);
context.SubmitChanges();

所以真的没什么特别的。这条语句一天执行大约5万次没有任何问题,但是:每天大约 6 - 10 次,它以以下方式结束:

在调用 SubmitChanges 期间无法执行该操作。

StackTrace:    at System.Data.Linq.DataContext.CheckNotInSubmitChanges()
at System.Data.Linq.Table`1.InsertOnSubmit(TEntity entity)

我试图找出那可能是什么但找不到线索这种行为非常不确定,礼貌地说 - 它如何正确完成 50k 次而很少几次没有?

DataContext 首先被初始化为一个静态的,然后被所有的调用重复使用,所以我在想也许这就是问题所在。然后我将其更改为在每次调用时都进行初始化,但结果非常相似。每天仍然很少有异常(exception)。

有什么想法吗?


一些补充:函数看起来像:

public override bool Log(ErrorLogData logData)
{

try
{
logData.ProcessID = _processID;
//Create new log dataset
var data = new DataRecord
{
application = logData.Application,
date = DateTime.Now,
Other = logData.Other,
process = logData.ProcessName,
processid = logData.ProcessID,
severity = logData.Severity,
username = logData.UserName,
Type = (short)logData.ErrorType
};


var context = new DataContext(ConnectionString);

context.tb_dayErrorLog.InsertOnSubmit(data);
context.SubmitChanges();

}
catch (Exception ex)
{
//log log in eventviewer
LogEvent(logData.ToString(), ex);
return false;
}
return true;
}

就这么简单记录初始化然后插入。

正如我在评论中所写,虽然通过 Ado.Net 和 SqlCommand 做同样的事情,但这个问题没有发生......

所以我的好奇心让我思考为什么?

最佳答案

这听起来像是一个线程问题,您在一个线程上调用 Log 并因此调用 SubmitChanges,而另一个线程正处于 SubmitChanges 的中间。

我怀疑你的 DataContext 仍然是一个全局静态变量。

尝试将您的 Log 方法更改为

using (var context = new DataContext(ConnectionString))
{
context.tb_dayErrorLog.InsertOnSubmit(data);
context.SubmitChanges();
}

关于c# - LinQ DataContext - 在调用 SubmitChanges 期间无法执行该操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8502909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com