Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# EF 6和x2013;在SaveChangesSync方法中异步执行SQL命令会引发NotSupportedException_C#_.net_Entity Framework_Async Await_Entity Framework 6 - Fatal编程技术网

C# EF 6和x2013;在SaveChangesSync方法中异步执行SQL命令会引发NotSupportedException

C# EF 6和x2013;在SaveChangesSync方法中异步执行SQL命令会引发NotSupportedException,c#,.net,entity-framework,async-await,entity-framework-6,C#,.net,Entity Framework,Async Await,Entity Framework 6,我已经重写了我的DbContext的savechangesync方法来调用一个bunch存储过程。首先调用DbContext的savechangesync,然后为每个更改的实体执行一个存储过程 等待所有异步方法调用 这是EF引发的异常: System.NotSupportedException: A second operation started on this context before a previous asynchronous operation completed. Use 'a

我已经重写了我的
DbContext
savechangesync
方法来调用一个bunch存储过程。首先调用
DbContext
savechangesync
,然后为每个更改的实体执行一个存储过程

等待所有异步方法调用

这是EF引发的异常:

System.NotSupportedException: A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.
   at System.Data.Entity.Internal.ThrowingMonitor.EnsureNotEntered()
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreCommandAsync(TransactionalBehavior transactionalBehavior, String commandText, CancellationToken cancellationToken, Object[] parameters)
   at System.Data.Entity.Internal.InternalContext.ExecuteSqlCommandAsync(TransactionalBehavior transactionalBehavior, String sql, CancellationToken cancellationToken, Object[] parameters)
   at System.Data.Entity.Database.ExecuteSqlCommandAsync(TransactionalBehavior transactionalBehavior, String sql, CancellationToken cancellationToken, Object[] parameters)
   at System.Data.Entity.Database.ExecuteSqlCommandAsync(String sql, CancellationToken cancellationToken, Object[] parameters)
   at System.Data.Entity.Database.ExecuteSqlCommandAsync(String sql, Object[] parameters)
   at Common.Dal.AuditDbContext.<>c__DisplayClass20_0.<WriteAuditsParallelAsync>b__0(Audit x) in 
   at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
   at System.Threading.Tasks.Task.WhenAll[TResult](IEnumerable`1 tasks)
   at Common.Dal.AuditDbContext.<WriteAuditsParallelAsync>d__20.MoveNext() in
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at Common.Dal.AuditDbContext.<SaveToDatabaseAsync>d__18.MoveNext() in
System.NotSupportedException:在上一个异步操作完成之前,在此上下文上启动了第二个操作。使用“await”确保在此上下文上调用另一个方法之前已完成任何异步操作。任何实例成员都不能保证线程安全。
位于System.Data.Entity.Internal.ThrowingMonitor.EnsureRenoted()处
位于System.Data.Entity.Core.Objects.ObjectContext.ExecuteStorommandAsync(TransactionalBehavior TransactionalBehavior,String commandText,CancellationToken CancellationToken,Object[]参数)
位于System.Data.Entity.Internal.InternalContext.ExecuteSqlCommandAsync(TransactionalBehavior TransactionalBehavior,String sql,CancellationToken CancellationToken,Object[]参数)
位于System.Data.Entity.Database.ExecuteSqlCommandAsync(TransactionalBehavior TransactionalBehavior,String sql,CancellationToken CancellationToken,Object[]参数)
位于System.Data.Entity.Database.ExecuteSqlCommandAsync(字符串sql,CancellationToken CancellationToken,对象[]参数)
位于System.Data.Entity.Database.ExecuteSqlCommandAsync(字符串sql,对象[]参数)
在Common.Dal.AuditDbContext.c__中显示Class20_0.b__0(审计x)
位于System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()
at System.Threading.Tasks.Task.WhenAll[TResult](IEnumerable`1 Tasks)
在中的Common.Dal.AuditDbContext.d_u20.MoveNext()处
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在中的Common.Dal.AuditDbContext.d_u18.MoveNext()处
这是我的代码:

public override Task<Int32> SaveChangesAsync( CancellationToken cancellationToken )
{
    var modified = this.GetModifiedOrDeletedEntities();
    var added = this.GetAddedEntities();

    var audits = AuditService.GetAudits( GetObjectStateManager(), modified );

    //Call SaveChangesAsync
    var result = await base.SaveChangesAsync( cancellationToken );

    audits.AddRange( AuditService.GetAudits( GetObjectStateManager(), added ) );

    //Call stored prcedures
    await WriteAuditsAsync( audits, user );

    return result;
}

private async Task WriteAuditsAsync(List<Audit> audits, String user)
{
    foreach ( var audit in audits)
    {
        try
        {
            ...
            //Execute SQL command 
            await Database.ExecuteSqlCommandAsync(myCommand, myParameters);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
}
public override Task savechangessync(CancellationToken CancellationToken)
{
var modified=this.getModifiedDeleteDentities();
var added=this.getAddedEntitys();
var audits=AuditService.GetAudits(GetObjectStateManager(),已修改);
//调用SaveChangesAsync
var result=await base.saveChangesSync(cancellationToken);
audits.AddRange(AuditService.GetAudits(GetObjectStateManager(),added));
//调用存储过程
等待WriteAuditsAsync(审核,用户);
返回结果;
}
专用异步任务WriteAuditsAsync(列表审核,字符串用户)
{
foreach(审计中的var审计)
{
尝试
{
...
//执行SQL命令
wait Database.ExecuteSqlCommandAsync(myCommand,myParameters);
}
捕获(例外情况除外)
{
控制台写入线(ex);
}
}
}

为什么EF会引发此异常?

查看此异常,您可以看到您正在调用
任务。当所有
writeAuditSparlallelasync
中时,这意味着您同时启动多个异步操作,并异步等待所有操作完成

在EF上下文上不能同时执行多个操作,这就是它抛出的原因


您可以通过依次执行这些操作来解决这个问题,每次启动并等待一个操作

您是否也在等待
savechangessync
WriteAuditsAsync
WriteAuditsParallelAsync
看起来可疑-您确定正在将调用同步到数据库?是的,我确实在等待savechangessync和WriteAuditsAsync(有关WriteAuditsAsync,请参阅代码)在
WriteAuditsParallelAsync
中使用
Task.whalll
。这是你的问题,不是你发布的代码。@i3arnon谢谢你!。。。我确实在调用Task.whalll…由于调用代码中的错误…