Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的EF核心DbContext不受DI约束?_C#_Azure_Asp.net Core_Entity Framework Core_Azure Function App - Fatal编程技术网

C# 为什么我的EF核心DbContext不受DI约束?

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。确保绑定支持

我有一个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文档的指示,我有一个
启动类
,并且完全遵循了他们的示例,除了以下行替代了他们配置的示例服务:

[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
还值得注意的是,这个函数应用程序项目中还有两个其他函数似乎没有任何严重的问题,我已经能够使用类似的方法为这个解决方案中的另一个(ASP.NET Core MVC)项目使用EF Core进行依赖项注入

提前感谢您提供的任何帮助


另外,我发现互联网上的.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)