我正在尝试通过与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上。
就是这样...希望有人能弄清楚。