gpt4 book ai didi

c# - 无法在 ASP.NET Core 操作筛选器中获取正确的 DbContext 引用

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

我想为 IAsyncActionFilter 中的每个请求调用 Entity Framework 的 SaveChangesAsync()

这是我的 IAsyncActionFilter:

DbContextSaveChangesFilter.cs

public class DbContextSaveChangesFilter : IAsyncActionFilter
{
private readonly DbContext _dbContext;

public DbContextSaveChangesFilter(DbContext dbContext)
{
_dbContext = dbContext;
}

public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var result = await next();
if (result.Exception == null || result.ExceptionHandled)
{
await _dbContext.SaveChangesAsync();
}
}
}

因此,在我的服务方法进行任何更改后,将调用 SaveChangesAsync():

Service.cs

private readonly DbContext _dbContext
public MyService(DbContext dbContext) {
_dbContext = dbContext;
}

public void SomeServiceMethod() {
var myEntity = _dbContext.MyEntities.First();
myEntity.Name = model.Name;
}

问题

问题是我在服务和过滤器中得到了对 _dbContext 的两个不同引用。也就是说,注入(inject)到我的服务中的 _dbContext 与注入(inject)到过滤器中的实例不同。

在过滤器和服务中调用 _dbContext.GetHashCode() 会得到两个不同的数字。

版本

.NET Core: 2.2.402
ASP.NET: 2.2.0
EF Core: 2.2.6
Sql Server:2019 EXPRESS

编辑:这就是我在 Startup.cs

中配置我的 DbContext 的方式
services.AddDbContext<MyDbContext>(opts =>
{
opts.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
});

下面是我如何在 ConfigureServices() 方法中的 Startup.cs 中注册我的过滤器:

services.AddMvc(o =>
{
o.Filters.Add(typeof(DbContextSaveChangesFilter));
});

最佳答案

首先,您不能使用 IAsyncActionFilter 执行此操作,因为 OnActionExecutionAsync

Called asynchronously before the action, after model binding is complete.

所以你来得太早了,这可能意味着过滤器已经从 DI 容器接收到它自己的上下文实例。这也是意料之中的,因为过滤器是异步的。但即使使用共享实例 SaveChanges 也不会在此时执行任何操作。

所以如果你想这样做你需要实现IActionFilter ,并使用其 OnActionExecuted 方法。我认为当 DI 容器被注册为请求范围时,它将为您提供与 Controller 中相同的上下文。如果没有,您可能想尝试使用 ActionExecutingContextController 属性,但这始终需要 Controller 上下文必须公开(或至少在内部)的代码构造可访问。

如您所见,我没有在代码中说明这一点,因为我认为您不应该这样做。在需要的地方调用 SaveChanges 可见,而不是其他任何地方。您当然不想冒险保存不应该保存的更改(很容易被忽略)。当方法仅读取数据时,您也不想调用 SaveChanges

关于c# - 无法在 ASP.NET Core 操作筛选器中获取正确的 DbContext 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59114310/

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