Asp.net core 无法解析类型为';Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`

Asp.net core 无法解析类型为';Microsoft.EntityFrameworkCore.DbContextOptionsBuilder`,asp.net-core,entity-framework-core,identityserver4,Asp.net Core,Entity Framework Core,Identityserver4,在ASP.NET core 3.1中将DBContextOptions Builder注入到CustomTicketStore时。我收到一条异常消息 无法构造某些服务(验证时出错) 服务描述符的服务类型: Microsoft.AspNetCore.Authentication.Cookies.ITicketStore生存期: 作用域实现类型:OneIAM.Services.CustomTicketStore:无法 为类型解析服务 'Microsoft.EntityFrameworkCore.Db

在ASP.NET core 3.1中将
DBContextOptions Builder
注入到
CustomTicketStore
时。我收到一条异常消息

无法构造某些服务(验证时出错) 服务描述符的服务类型: Microsoft.AspNetCore.Authentication.Cookies.ITicketStore生存期: 作用域实现类型:OneIAM.Services.CustomTicketStore:无法 为类型解析服务 'Microsoft.EntityFrameworkCore.DbContextOptionsBuilder'1[OneIAM.Data.ApplicationDbContext]' 尝试激活“OneIAM.Services.CustomTicketStore”时。)

下面是启动文件中的代码

        public virtual void ConfigureServices(IServiceCollection services)
        {
          ...

          // Persistent ticket/cookie store to provide durable user sessions
          services.AddScoped<ITicketStore, CustomTicketStore>();
          var optionsBuilder = GetDbContextOptionsBuilder(services);

          services.ConfigureApplicationCookie(options =>
          {
            options.SlidingExpiration = true;
            options.SessionStore = new CustomTicketStore(optionsBuilder);  <=
          });
        }

        private static DbContextOptionsBuilder<ApplicationDbContext> GetDbContextOptionsBuilder(IServiceCollection services)
        {
            using (var scope = services.BuildServiceProvider().CreateScope())
            {
                return scope.ServiceProvider.GetService<DbContextOptionsBuilder<ApplicationDbContext>>();
            }
        }
公共虚拟void配置服务(IServiceCollection服务)
{
...
//持久化票证/cookie存储,提供持久的用户会话
services.addScope();
var optionsBuilder=GetDbContextOptionsBuilder(服务);
services.configureApplicationOK(选项=>
{
options.SlidingExpiration=true;

options.SessionStore=new CustomTicketStore(optionsBuilder);首先,我测试您的代码,发现它将使用
services.AddScoped();
这是我的CustomTicketStore:

public class CustomTicketStore: ITicketStore
    {
        private readonly DbContextOptionsBuilder<ApplicationDbContext> _optionsBuilder;
        

        public CustomTicketStore(DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder)
        {
            _optionsBuilder = optionsBuilder;
        }

        .......
    }
公共类CustomTicketStore:ITicketStore
{
私有只读DbContextOptionsBuilder\u optionsBuilder;
公共CustomTicketStore(DBContextOptionsBuilderOptionsBuilder)
{
_optionsBuilder=optionsBuilder;
}
.......
}
我发现如果我在CustomTicketStore中添加一个没有参数的构造函数,它会工作:

public class CustomTicketStore: ITicketStore
    {
        private readonly DbContextOptionsBuilder<ApplicationDbContext> _optionsBuilder;
        public CustomTicketStore()
        {
        }

        public CustomTicketStore(DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder)
        {
            _optionsBuilder = optionsBuilder;
        }

        ........
    }
公共类CustomTicketStore:ITicketStore
{
私有只读DbContextOptionsBuilder\u optionsBuilder;
公共CustomTicketStore()
{
}
公共CustomTicketStore(DBContextOptionsBuilderOptionsBuilder)
{
_optionsBuilder=optionsBuilder;
}
........
}

也许你可以分享你的
CustomTicketStore
@YiyiYou我在
CustomTicketStore
中没有添加太多。只需使用
DbContextOptionsBuilder
参数添加
constructor
构造函数即可。我在
dotnet run
@YiyiYou上遇到此错误,但是你可以从中获取
CustomTicketStore>的参考
谢谢@YiyiYou。它对我有效,没有注入服务
services.AddScoped();
也没有获得
用户(ClaimsPrincipal)
,这意味着在主页上无法加载用户。我的意思是你可以添加
公共CustomTicketStore(){}
CustomTicketStore
,您不需要删除
服务。AddScoped();
尝试了两种方法,但没有将
'user'(var user=wait _userManager.GetUserAsync(user);)的值设置为null。您可以检查是否将数据保存到上下文并将其正确保存到数据库。