Azure函数v2具有ASP.NET Core配置(数据库优先)

时间:2018-10-16 09:36:42

标签: asp.net entity-framework azure azure-functions azure-blob-storage

我正在尝试通过与Blob存储和SQL数据库的连接来实现azure函数v2。

有许多不再受支持的软件包;我发现不再支持Microsoft.WindowsAzure.Configuration,我需要使用ASP.NET Core Configuration

我尝试按照此article中的说明实施该操作,但是在蔚蓝的cli中始终出现错误:

System.Private.CoreLib: Exception while executing function: QueueProcessor. QueueProcessorAzureFunction: Could not load file or assembly 'Microsoft.Extensions.Configuration.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621). System.Private.CoreLib: Could not load file or assembly 'Microsoft.Extensions.Configuration.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.

同样,当尝试像往常一样访问sql数据库时:

using (var context =  new DBEntities)
{
[…]
}

我在cli中遇到另一个错误:

System.Private.CoreLib: Exception while executing function: QueueProcessor. EntityFramework: The type initializer for 'System.Data.Entity.Internal.AppConfig' threw an exception. EntityFramework: Could not load file or assembly 'System.Configuration.ConfigurationManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.

我想念什么?谁能帮忙吗?

谢谢

编辑:

请求的代码:

namespace QueueProcessorAzureFunction
{
public class StorageContext
{

    private CloudStorageAccount _storageAccount;

    public StorageContext(ExecutionContext context)
    {

        var config = new ConfigurationBuilder()
            .SetBasePath(context.FunctionAppDirectory)
            .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();


        _storageAccount = CloudStorageAccount.Parse(config.GetConnectionString("BlobStorage"));
    }

    public CloudBlobClient BlobClient
    {
        get { return _storageAccount.CreateCloudBlobClient(); }
    }

    public CloudTableClient TableClient
    {
        get { return _storageAccount.CreateCloudTableClient(); }
    }

    public CloudQueueClient QueueClient
    {
        get { return _storageAccount.CreateCloudQueueClient(); }
    }
}
}

在队列内触发天蓝色函数:

public static void Run([QueueTrigger("stack", Connection = "AzureWebJobsStorage")]string myQueueItem, TraceWriter log, ExecutionContext context)
{
var storageContext = new StorageContext(context);

[…]
}

local.settings.json内:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "[…]",
    "AzureWebJobsDashboard": "",
    "BlobStorage": "[…]"
},
  "ConnectionStrings": {
    "DBEntities": {
      "ConnectionString": "[…]",
      "ProviderName": "System.Data.EntityCLient"
  },
  "BlobStorage": "[…]"
 }
}

编辑2

好,所以在定义var config时发生错误;现在,我将像这样简单地在Storage上下文构造函数中传递连接字符串:

    public StorageContext(ExecutionContext context)
    {
        _storageAccount = CloudStorageAccount.Parse("CompleteConnectionString");
    }

编辑3

对于SQL数据库的问题,假设我的数据库在第二个项目中,我在其中添加了ADO.NET实体数据模型;我不确定如何解决该问题。

根据我的想法,在.NET Standard中,我现在需要在数据库上下文中使用依赖项注入。但是鉴于我拥有数据库优先模型,所以我没有数据库上下文...

编辑4

实体框架核心...我想您需要将实体框架核心与Azure函数v2结合使用...尝试THIS

编辑5

好的。 首先,尝试将Scaffold-DbContext与NuGet控制台一起使用以在.NET Standard项目中生成DBContext无效。因此,.NET Standard 2.0的Azure函数v2实际上不能使用Scaffold-Dbcontext来生成其DbContext。

要解决此问题,我进行了第二个.Net Core项目,使用Scaffold-DBcontext命令生成Dbcontext和表,然后将它们简单地复制到我的Azure函数项目中。 实际上,我使用了VS的Developer Command提示符,但是我假设使用NuGet控制台是相同的。这是执行it的有用链接。

接下来,您必须使用依赖项注入。这就是我遇到的困难...那是由于NuGet数据包版本管理。 Here是有用的链接,用于了解如何在azure函数中实现依赖注入。

简单地:在安装软件包AzureFunctions.Autofac.2.0.0(注意版本)和Autofac.4.8.1之后,添加一个新的类文件(将其命名为config.cs);里面:

public class Config
{
    public Config()
    {
        DependencyInjection.Initialize(builder =>
        {
            builder.RegisterType<DBContext>();
        });
    }
}

现在,您将上下文作为参数传递,例如[Inject]DBContext context,然后需要在名称空间的正下方添加[DependencyInjectionConfig(typeof(AutofacConfig))],我想您现在就可以访问数据库了。使用Linq,我可以编写如下内容: var a = context.Studies.Where(s => s.Id == 10569).FirstOrDefault(); 这就是为什么我认为这可行。

总体来说,我的函数是这样的:

namespace FunctionApp10
{

[DependencyInjectionConfig(typeof(Config))]
public static class Function1
{
    [FunctionName("Function1")]
    public static void Run([QueueTrigger("queue", Connection = "AzureWebJobsStorage")]string myQueueItem, TraceWriter log, [Inject]DBContext context)
    {

        var a = context.Studies.Where(s => s.Id == 10569).FirstOrDefault();

    }
}
}

但是当我构建时会出现错误

System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Azure.WebJobs, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

我想这是因为它在寻找3.0.0-beta5时正在寻找版本2.1.0。我尝试编辑csproj没有成功。

现在,如果您尝试下载AzureFunctions.Autofac.3.0.5,它将卸载Windows.Azure.Storage.8.6.0,即使您手动重新安装,也会出现类似以下错误:

The type or namespace name 'QueueTriggerAttribute' could not be found (are you missing a using directive or an assembly reference?)

My Issue在GitHub上。

就是这样...希望有人能弄清楚。

0 个答案:

没有答案