C# 为什么我的EF核心DbContext不受DI约束?
我有一个Azure函数应用程序,它的函数运行在blob触发器上。我已经证明,此功能可以在Azure门户中运行,并响应此blob触发器而不会出现问题。。。至少是这样 现在,我添加了使用EF Core(2.2.4)的功能,在本地调试和发布到Azure时,都会出现以下错误: Microsoft.Azure.WebJobs.Host:索引方法“ParseThings”时出错。Microsoft.Azure.WebJobs.Host:无法将参数“上下文”绑定到类型AvastusContext。确保绑定支持该参数类型。如果您正在使用绑定扩展(例如Azure存储、ServiceBus、计时器等),请确保已在启动代码中调用扩展的注册方法(例如builder.AddAzureStorage()、builder.AddServiceBus()、builder.AddTimers()等) 按照Azure Function App文档的指示,我有一个C# 为什么我的EF核心DbContext不受DI约束?,c#,azure,asp.net-core,entity-framework-core,azure-function-app,C#,Azure,Asp.net Core,Entity Framework Core,Azure Function App,我有一个Azure函数应用程序,它的函数运行在blob触发器上。我已经证明,此功能可以在Azure门户中运行,并响应此blob触发器而不会出现问题。。。至少是这样 现在,我添加了使用EF Core(2.2.4)的功能,在本地调试和发布到Azure时,都会出现以下错误: Microsoft.Azure.WebJobs.Host:索引方法“ParseThings”时出错。Microsoft.Azure.WebJobs.Host:无法将参数“上下文”绑定到类型AvastusContext。确保绑定支持
启动类
,并且完全遵循了他们的示例,除了以下行替代了他们配置的示例服务:
[assembly: FunctionsStartup(typeof(AvstFunctionApp.Startup))]
namespace AvstFunctionApp
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddDbContext<AvastusContext>(options => options.UseSqlServer(Environment.GetEnvironmentVariable("AvastusDb")));
}
}
}
我可以确认AddDbContext
行在调试器中被击中,所以这里可能有一些bug发生在幕后,或者我正在做一些非常愚蠢的事情
我尝试过但没有奏效的事情包括:
- 将
添加到.BuildServiceProvider(true)
行AddDbContext
- 使用
而不是最近发布的WebJobsStartup
功能启动
- 降级到.NET Core 2.2.0
- 将函数类和
方法从静态更改为实例Run
- 修复插入的
AvastusContext
另外,我发现互联网上的.NET Core、Azure Function Apps和EF Core的最新版本没有任何描述这种情况的东西,这让我觉得不可思议,这可能是一个简单的错误。希望不是。也许一种解决方案是,您可以尝试在函数中注入IServiceProvider,而不是像我在下面的repository类中注入的AvastusContext:
private readonly-IServiceProvider服务提供商;
公共存储库(IServiceProvider服务提供商)
{
this.serviceProvider=serviceProvider;
}
使用var context=this.serviceProvider.GetService();
这将为您提供一个上下文对象。另外,不确定为什么要直接访问函数中的上下文以获得良好实践,请定义一个上下文类,并维护存储库以在代码中执行任何CRUD操作
Startup.cs您可以添加额外的配置,如:
builder.Services.AddDbContext(
选项=>
{
options.UseSqlServer(
康涅狄格州,
SQLServerOptions操作:
sqlOptions=>
{
EnableRetryOnFailure(maxRetryCount:3,maxRetryDelay:TimeSpan.FromSeconds(30),errorNumbersToAdd:null);
});
},服务寿命。瞬态);
在我当前的解决方案中,此配置工作得非常好。试试这个。今天我自己也在努力解决这个问题。尝试使ParseThings类成为非静态类,并将上下文注入构造函数而不是方法。我就是这样做的。不过我对Azure函数还不熟悉,所以我不知道在部署到Azure时该类是否出于任何原因需要是静态的,但它在本地对我有效。谢谢你的建议。不幸的是,将函数类更改为实例类而不是静态类、添加带有依赖项注入参数的构造函数以及将
Run
方法从静态方法更改为实例方法并不能解决问题。我可以确认,ILogger
实例没有受到投诉,而AvastusContext
由于缺少解析而抛出了一个invalidoOperationException
。也许添加DbContext的行应该移到添加azure函数的行上方?我只是在这里猜测,但是如果他们在您添加DbContext之前构建serviceprovider,那可能是个问题。谢谢你,Jesse。不幸的是,函数指定的模式在重写的Configure
方法中公开了iffunctionshostbuilder
,因此我没有显式构建任何由FunctionsStartup
类处理的内容。我将更新问题中的第一个代码块,向您显示AddDbContext
周围的行。
public static class ParseThings
{
[FunctionName("ParseThings")]
public static void Run([BlobTrigger("summaries/{name}", Connection = "StorageConnectionString")]Stream myBlob, string name, ILogger log, AvastusContext context)