C# 实体框架6不允许新事务处理
在.NET 4.0和Web API上的ASP.NET Webforms应用程序中,我试图向数据库添加order和orderRow,但出现以下错误: 错误:不允许新事务,因为会话中还有其他正在运行的线程 在客户端,我向控制器运行了一个Ajax post,其中包含以下代码,用于将值插入数据库:C# 实体框架6不允许新事务处理,c#,entity-framework,C#,Entity Framework,在.NET 4.0和Web API上的ASP.NET Webforms应用程序中,我试图向数据库添加order和orderRow,但出现以下错误: 错误:不允许新事务,因为会话中还有其他正在运行的线程 在客户端,我向控制器运行了一个Ajax post,其中包含以下代码,用于将值插入数据库: private readonly MyDatabaseEntities _ctx; public ComponibileController() { _ctx = new MyDatabaseEnt
private readonly MyDatabaseEntities _ctx;
public ComponibileController()
{
_ctx = new MyDatabaseEntities(@"xxx");
}
[HttpPost]
public void Post([FromBody] ComponibileCreate model)
{
if (!ModelState.IsValid) return;
var taskWork = System.Threading.Tasks.Task.Run(() => SaveOnDatabase(model, utente));
...query
SendMailToUser(...);
taskWork.Wait();
}
public void SaveOnDatabase(ComponibileCreate model, string utente)
{
try
{
using (_ctx)
{
var ordine = new COM_ORDINI
{
..,
};
foreach (var item in model.Righe.ToList())
{
var righe = new COM_RIGHE
{
...
};
ordine.COM_RIGHE.Add(righe);
}
_ctx.COM_ORDINI.Add(ordine);
_ctx.SaveChanges();
}
}
catch (Exception e)
{
}
}
而是
System.Threading.Tasks.Task.Run(()=>SaveOnDatabase(model,ute))代码>,使用
async Task SaveOnDatabase(ComponibileCreate model, string utente) {
...
await _ctx.SaveChangesAsync();
}
并调用await SaveOnDatabase(model,utete)
执行我非常确定for-each循环导致了问题(尤其是.ToList())。这里进一步描述:不要在任务中运行它如果我可以使用async/await,我没有错误,但如何解决?不要使用任务。不要试图使用来自不同线程的相同上下文。它不是线程安全的,也不像数据库连接那样,不能长久使用。它也不应该存储在字段中,除非多个方法需要使用具有相同缓存数据的同一实例。事实上,此代码很容易导致其他异常。例如,如果SaveOnDatabase
完成得太快,则上下文可能在其他查询运行之前被释放,从而导致ObjectDisposedException
。如果您想并行执行多个操作,请创建并使用新的DbContext实例尝试保存当前线程中的更改,可能ORM无法做到这一点,那么我应该怎么做?@Gigilatotola升级到受支持的框架。真正地NET4.0已经多年不受支持了,没有人人都需要的TLS1.2支持。或者不要尝试异步执行任何操作。请求已经由单独的线程处理了,使用queryOk的另一个线程没有任何好处。我删除了任务,用一个新线程包装了邮件,看起来效果很好。各位