C# 实体框架6不允许新事务处理

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

在.NET 4.0和Web API上的ASP.NET Webforms应用程序中,我试图向数据库添加order和orderRow,但出现以下错误:

错误:不允许新事务,因为会话中还有其他正在运行的线程

在客户端,我向控制器运行了一个Ajax post,其中包含以下代码,用于将值插入数据库:

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的另一个线程没有任何好处。我删除了任务,用一个新线程包装了邮件,看起来效果很好。各位