Проблема с Entity Framework 6 при подключении к SQL Server из функции Azure V2 - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь использовать существующую библиотеку, которая является сетью .net, которая использует EF 6.0 для подключения к базе данных.Поскольку в функциях Azure отсутствует файл app.config, я пытаюсь установить строку подключения с помощью кода C #.Но я получаю следующее исключение при подключении к БД с использованием контекста БД:

System.ArgumentException: поставщик ADO.NET с инвариантным именем 'System.Data.SqlClient' либо не зарегистрирован вфайл конфигурации компьютера или приложения, или не удалось загрузить.Подробности см. Во внутреннем исключении.

System.ArgumentException: указанное имя инварианта 'System.Data.SqlClient' не найдено в списке зарегистрированных поставщиков данных .NET

MyDBContext.partial.cs:

[DbConfigurationType(typeof(MyDbConfiguration))]
public partial class MyDBContext : DbContext
{
    public MyDBContext (string ConnectionString)
        : base(ConnectionString)
    {     
    }
}

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration()
    {
        SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);
        SetDefaultConnectionFactory(new SqlConnectionFactory());
    }
}

У меня есть следующий метод для получения DBContext.Этот метод будет использоваться методами библиотеки для получения экземпляра контекста БД.

public MyDBContext GetDB( string metadata, string connectionString )
{
    EntityConnectionStringBuilder b = new EntityConnectionStringBuilder();
    b.Metadata = metadata;
    b.ProviderConnectionString = connectionString;
    b.Provider = "System.Data.SqlClient";
    return new MyDBContext (b.ConnectionString);
}

Когда я выполняю метод библиотеки для загрузки данных из базы данных из функции Azure v2, которая внутренне вызывает вышеуказанный метод для полученияКонтекст БД, а затем подключается к реальной БД.Здесь объект MyDBContext создается, но когда он подключается к базе данных, возникает следующее исключение:

System.ArgumentException: поставщик ADO.NET с инвариантным именем 'System.Data.SqlClient' либо не зарегистрированв файле конфигурации компьютера или приложения, или не может быть загружен.Смотрите внутреннее исключение для деталей.

System.ArgumentException: указанное имя инварианта 'System.Data.SqlClient' не найдено в списке зарегистрированных поставщиков данных .NET

1 Ответ

0 голосов
/ 25 сентября 2019

Я только что работал над этой проблемой, но для функции Azure V1.При использовании EF с функцией Azure вы можете указать строку подключения в файле local.settings.json следующим образом:

{
    "IsEncrypted": false,
    "Values": {
    "AzureWebJobsStorage": "",
    "AzureWebJobsDashboard": ""
    },
    "ConnectionStrings": {
        "YourEntities": {
            "ConnectionString":  "metadata=res://*/EF.yourModel.csdl|res://*/EF.yourModel.ssdl|res://*/EF.yourModel.msl;provider=System.Data.SqlClient;provider connection string='data source=yourServer;initial catalog=yourDB;persist security info=True;user id=yourUserID;password=yourPwd;MultipleActiveResultSets=True;App=EntityFramework'",
            "ProviderName": "System.Data.EntityClient"
        }
    }
}

Обратите внимание на атрибут ProviderName.Регистр должен быть точным, как показано выше, а провайдер должен быть «EntityClient» Plus «Строка соединения провайдера» атрибута фактической строки соединения должен быть в одинарных кавычках (я не уверен, почему Microsoft сделала это, но так и должно быть).

Это поможет вам локально запустить ваше функциональное приложение с EF без каких-либо изменений

Теперь для развертывания в Azure.local.settings.json не развертывается в облаке.Как следует из названия, он действует как файл конфигурации для локального запуска.Поэтому вам нужно установить строку подключения в «Конфигурации» приложения-функции Azure на портале.Там вы можете указать следующие параметры:

Name - 'YourEntities'
value - Just Connection string part from above json file
Type - 'Custom'
Slot Settings - according to your requirement

Теперь, если вы заметили, что здесь невозможно указать ProviderName.Если вы попытаетесь запустить функцию сейчас, вы получите сообщение об ошибке «отсутствует имя поставщика»

Здесь вам пригодится расширенный класс DBConfiguration.

Создайте свой класс конфигурации БД, как показано ниже, и укажите провайдера как EntityType.

public class YourDBContextConfig : DbConfiguration
{
    public YourDBContextConfig()
    {
    SetProviderServices("System.Data.EntityClient",
    SqlProviderServices.Instance);
    SetDefaultConnectionFactory(new SqlConnectionFactory());
    }

}

Вы можете создать этот класс в том же файле, в котором вы создали частичный класс для вашего DBContext

Добавить следующий атрибут в свой класс Context: [DbConfigurationType (typeof (YourDBContextConfig))]

Также убедитесь, что у вашего класса частичного контекста есть конструктор, который принимает строку подключения в качестве параметра и указывает ее при инициализации контекста:

string connString = 
ConfigurationManager.ConnectionStrings["YourEntities"].ConnectionString;
using (YourEntities db = new YourEntities(connString))
{
}

Это будет работать для развертывания.

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