C# 如何在操作筛选器中插入DbContext

C# 如何在操作筛选器中插入DbContext,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我有一个操作过滤器,它将请求记录在数据库中 我使用通常的构造方法 public ServerLogFilterAttribute(OrderEntryContext context) { this.context = context; } public override void OnActionExecuting(ActionExecutingContext context) { var descriptor = context.ActionDescriptor; if

我有一个操作过滤器,它将请求记录在数据库中

我使用通常的构造方法

public ServerLogFilterAttribute(OrderEntryContext context)
{
  this.context = context;
}

public override void OnActionExecuting(ActionExecutingContext context)
{
    var descriptor = context.ActionDescriptor;
    if (descriptor != null && descriptor.RouteValues.Count > 0)
    {
        var actionName = descriptor.RouteValues["action"];
        var controllerName = descriptor.RouteValues["controller"];

        if (context.HttpContext.User != null && context.HttpContext.User.Identity != null)
        {
            var claimsIdentity = context.HttpContext.User.Identity as ClaimsIdentity;

            if (claimsIdentity != null && claimsIdentity.IsAuthenticated)
            {
                var username = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier).Value;
                var userId = claimsIdentity.Claims.First(c => c.Type == "userId").Value;

                var serverLog = new ServerLog()
                {
                    AspNetUserId = userId,
                    Controller = controllerName,
                    Action = actionName,
                    TimeStamp = DateTime.Now
                };

                LoggerRepository loggerRepository = new LoggerRepository(this.context);
                Task.Run(() => loggerRepository.InsertServerCallLog(serverLog));
            }
        }
    }

    base.OnActionExecuting(context);

}
但这会在SaveChanges()期间引发异常:


那么我应该如何注入DbContext呢?

您使用的是
Task.Run(()=>loggerRepository.InsertServerCallLog(serverLog))
将上下文分配给变量
loggerRepository
,并告诉它在线程池上运行,从而让方法继续执行。方法很可能在线程池完成执行和对象被释放之前退出,只需在主线程上运行对
InsertServerCallLog
的调用,以便在完成该方法之前不会继续执行

@RyanWilson,谢谢你,就是这样。我完全错过了。如果你想发布答案,我会接受。将其移动到一个答案,很高兴我可以帮助。没有必要说这是一个评论。另外,既然问题已经是答案,你应该把你的评论从问题中删除
System.ObjectDisposedException
  HResult=0x80131622
  Message=Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.
  Source=Microsoft.EntityFrameworkCore
  StackTrace:
   at Microsoft.EntityFrameworkCore.DbContext.CheckDisposed()
   at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
   at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
   at Microsoft.EntityFrameworkCore.DbContext.<SaveChangesAsync>d__48.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at GGL.OrderEntry.Data.OrderEntryContext.<SaveChangesAsync>d__251.MoveNext() in C:\Dev\GGL\GGL.OrderEntry\GGL.OrderEntry.Data\Context\OrderEntryContext.Partial.cs:line 306
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);