Функции Azure v2 с конфигурацией ядра ASP.NET (сначала база данных) - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь реализовать функции Azure v2 с подключениями к хранилищу BLOB-объектов и базе данных SQL.

Существует множество пакетов, которые больше не поддерживаются;и я обнаружил, что Microsoft.WindowsAzure.Configuration больше не поддерживается и что мне нужно использовать ASP.NET Core Configuration.

. Я пытался реализовать это, как описано в этой статье , но я получаю сообщение об ошибкевнутри лазурного кли:

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)
{
[…]
}

Я получаю еще одну ошибку в кли:

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(); }
    }
}
}

Внутри очереди триггера Azureфункция:

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конфигурации;сейчас я просто передам строку подключения в конструкторе контекста Storage следующим образом:

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

EDIT 3

Итак, для проблемы с базой данных SQL,учитывая, что моя база данных находится во втором проекте, где я добавляю модель данных сущности ADO.NET;Я не уверен, как я могу решить эту проблему.

Из того, что я понял, в .NET Standard мне нужно сейчас использовать инъекцию зависимостей в контекст БД.Но, учитывая, что у меня есть модель базы данных первой, у меня нет контекста БД ...

РЕДАКТИРОВАТЬ 4

Entity Framework Core ... Я думаю, вынеобходимо использовать Entity Framework Core с функцией Azure v2 ... попробуйте ЭТО .

РЕДАКТИРОВАТЬ 5

ОК.Во-первых, попытка использовать Scaffold-DbContext с консолью NuGet для генерации DBContext в проекте .NET Standard не работает.Следовательно, функции Azure v2 стандарта .NET 2.0 не могут использовать Scaffold-Dbcontext для генерации своего DbContext.

Чтобы обойти это, я создал второй проект .Net Core, использовавший команду Scaffold-DBcontext длясоздайте Dbcontext и таблицы, а затем просто скопируйте их в мой проект функции Azure.На самом деле я использовал командную строку разработчика для VS, но я предполагаю, что использование консоли NuGet будет таким же.Вот полезная ссылка, чтобы сделать it .

Далее вы должны использовать внедрение зависимостей.И вот тут я застрял ... И это из-за управления версиями пакетов NuGet. Здесь - полезная ссылка, чтобы понять, как внедрить Dependency Injection в функциях Azure.

Просто: после установки пакета AzureFunctions.Autofac.2.0.0 (обратите внимание на версию) и Autofac.4.8.1 добавьте новый файл класса (давайте назовем его config.cs); Внутри:

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

Теперь вы передаете Context как параметр, такой как [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.

И я думаю, это потому, что он ищет версию 2.1.0, а у меня 3.0.0-бета5.Я попытался отредактировать 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?)

Мой выпуск на GitHub.

Вот и все ... Надеюсь, кто-нибудь это выяснит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...