gpt4 book ai didi

c# - UseInMemoryDatabase 与 UseInternalServiceProvider。没有配置数据库提供程序

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

我在使用 EntityFrameworkCore 时无法注入(inject)自定义 IAsyncQueryProvider。更准确地说.. 在使用提供的内存数据库功能时,我无法注入(inject)提供程序。使用默认提供程序 (SqlServer),一切正常。

这是我的全局 Startup.cs

private void ConfigureEntityFrameworkWithSecurity(IServiceCollection services)
{
services
.AddEntityFramework()
.AddEntityFrameworkSqlServer()
.AddScoped<IAsyncQueryProvider, CustomEntityProvider>()
.AddDbContext<APIContext>((sp, options) =>
{
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
.UseInternalServiceProvider(sp);
});
}

这可以完美地工作,我可以在 CustomEntityProvider 中放置一个断点来验证它确实被注入(inject)了。目前,CustomEntityProvider 只是实现了 IAsyncQueryProvider,并简单地传递了请求。其中没有任何逻辑。

当我运行测试时,我将 webhost 配置为使用不同的 Startup 文件:

public class TestStartup : Startup
{
public TestStartup(IHostingEnvironment env) : base(env)
{
}

public override void ConfigureServices(IServiceCollection services)
{
services
.AddDbContext<APIContext>((sp, options) =>
{
options.UseInMemoryDatabase()
.UseInternalServiceProvider(sp);
});
base.ConfigureServices(services);
}
}

使用 TestStartup 运行测试会产生错误:

System.InvalidOperationException : No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext.

并且 APIContext 被正确定义:

public class APIContext : DbContext
{
public APIContext(DbContextOptions<APIContext> options)
: base(options)
{
}
...
}

TestStartup 中删除 UseInternalServiceProvider 工作正常 - 但是,我不希望我的测试命中实际数据库。此外,我希望 UseInMemoryDatabase 自动将依赖项注入(inject)服务提供者 - 因为它本身工作得很好。

错误令人困惑,因为内存数据库我想使用的提供程序。

最佳答案

不幸的是,解决方案非常简单。但是,似乎很少有关于将依赖注入(inject)与内存数据库功能结合使用的文档。它似乎是其中之一。希望这个问题能为将来不幸遇到此问题的人提供帮助。

我下载了 EntityFramework 源代码进行调查,发现调用 UseInMemoryDatabase 会创建一个扩展 InMemoryOptionsExtension,它本身会添加到服务提供者,即:

public virtual void ApplyServices(IServiceCollection services)
{
Check.NotNull(services, nameof(services));

services.AddEntityFrameworkInMemoryDatabase();
}

解决方案就像看起来一样简单:

public class TestStartup : Startup
{
public TestStartup(IHostingEnvironment env) : base(env)
{
}

public override void ConfigureServices(IServiceCollection services)
{
services
.AddEntityFrameworkInMemoryDatabase()
.AddDbContext<APIContext>((sp, options) =>
{
options.UseInMemoryDatabase().UseInternalServiceProvider(sp);
});
base.ConfigureServices(services);
}
}

关于c# - UseInMemoryDatabase 与 UseInternalServiceProvider。没有配置数据库提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40586184/

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