相关疑难解决方法(0)

实体框架核心服务默认生命周期

在ASP.NET Core应用程序中,我可以像这样通过DI注册DbContext

services.AddDbContext<Models.ShellDbContext>(options => options.UseNpgsql(connection));
Run Code Online (Sandbox Code Playgroud)

而知道它的生命周期是什么呢?

从这里https://github.com/aspnet/EntityFramework/blob/f33b76c0a070d08a191d67c09650f52c26e34052/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L140看起来它被配置为作用域,这意味着的DbContext实例在每次请求创建.

所以问题的第一部分是:它是真的,如果是,那么它的代价是多少?

第二部分是:如果我创建一个消耗DbContext的服务,并且打算由控制器使用,并且将有一个API来管理DB中的某些实体,它是否应该注册为Scoped?

entity-framework-core asp.net-core

38
推荐指数
2
解决办法
2万
查看次数

注入DbContext时无法访问ASP.NET Core中的已处置对象

在ASP.NET Core项目中,我在Startup上有以下内容:

  services.AddDbContext<Context>(x => x.UseSqlServer(connectionString));

  services.AddTransient<IValidationService, ValidationService>();

  services.AddTransient<IValidator<Model>, ModelValidator>();
Run Code Online (Sandbox Code Playgroud)

ValidationService如下:

public interface IValidationService {
    Task<List<Error>> ValidateAsync<T>(T model);
}

public class ValidationService : IValidationService {
    private readonly IServiceProvider _provider;

    public ValidationService(IServiceProvider provider) {
        _provider = provider;
    }

    public async Task<List<Error>> ValidateAsync<T>(T model) {
        IValidator<T> validator = _provider.GetRequiredService<IValidator<T>>();

        return await validator.ValidateAsync(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

ModelValidator如下:

public class ModelValidator : AbstractValidator<Model> {
  public ModelValidator(Context context) {
    // Some code using context
  }
}
Run Code Online (Sandbox Code Playgroud)

当我在控制器中注入IValidationService并将其用作:

List<Error> errors = await _validator.ValidateAsync(order);    
Run Code Online (Sandbox Code Playgroud)

我收到错误:

System.ObjectDisposedException:无法访问已处置的对象.此错误的常见原因是处理从依赖项注入解析的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例.如果您在上下文中调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况.如果使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例.对象名称:'上下文'.

知道为什么我在ModelValidator中使用Context时遇到此错误.

如何解决这个问题?

UPDATE …

entity-framework-core asp.net-core

20
推荐指数
4
解决办法
4万
查看次数