Развернутая функция Azure выдает ошибку ProviderName - PullRequest
0 голосов
/ 14 марта 2019

У меня есть приложение-функция Azure, которое, когда я отлаживаю его на своем локальном ПК, не выдаст никакой ошибки и будет работать правильно, но при развертывании его в сети функций Azure оно выдаст ошибку, указывающую, что мойДля соединения сущностей не указано ProviderName.

Я следовал решениям, указанным в Отсутствует ProviderName при отладке AzureFunction, а также при развертывании функции Azure , я создал myDBContextConfig и добавил его вАвтоматически сгенерированный файл dbContext из моего .edmx, но у меня все еще остается та же проблема после развертывания.

Вот некоторые скриншоты и данные конфигурации, которые я использую:

Ошибка: The Provider Name Error

Local.settings.json:

{ "IsEncrypted": false,
  "Values": { 
             //Some Values
  },
 "ConnectionStrings": {
  "Entities": {
  "ConnectionString": "metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string='data source=ES-HHASQL01\\SQLES;initial catalog=Entities;persist security info=True;Integrated Security=False;User ID=****;Password=****;MultipleActiveResultSets=True;application name=EntityFramework'",
  "ProviderName": "System.Data.EntityClient"
    }
  } 
}

И строка подключения функций Azure:

enter image description here

Скрытое соединение соответствует стилю приведенного ниже текста.

metadata = res: ///Models.myDB.csdl | res: ///Models.myDB.SSDL | Рез: //*/Models.myDB.msl; поставщик = System.Data.SqlClient; строка подключения поставщика = 'источник данных = [yourdbURL]; начальный каталог = myDB; постоянная информация о безопасности = True; идентификатор пользователя = xxxx; пароль = xxx; MultipleActiveResultSets = True; App =EntityFramework

Если кто-нибудь может мне помочь с этим, я был бы очень признателен.Спасибо.

Редактировать:

Итак, я проверил проблему с кодом, предоставленным @Joey Cai, и сделал следующие изменения:

новая строка подключения параметров приложения имеет следующий вид:

Источник данных = tcp: *. database.windows.net, 1433; Исходный каталог = *** MultipleActiveResultSets = true; Идентификатор пользователя =*; Пароль = ***; Время ожидания соединения = 30; Приложение = EntityFramework;

Я добавил класс конфигурации базы данных в автоматически сгенерированный код из dbContext:

 [DbConfigurationType(typeof(EntitiesConfig))]
public partial class Entities : DbContext
{
    public Entities()
        : base("name=Entities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }
}

и созданный класс определен с помощью: @Joey Cai

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

Но знайте, что я получаю эту ошибку при запуске функции azure, только если тип соединения - SQLServer или SQLAzure, еслиесли выбрано значение «Пользовательский», по-прежнему отображается ошибка «ProviderNamer», показанная ранее: New Error

1 Ответ

0 голосов
/ 15 марта 2019

Вы не можете добавить метаданные EF о соединении в функции Azure, так как они не используют app.config для его указания.Это не часть строки соединения, а метаданные о соединении, кроме строки соединения, которую EF использует для сопоставления с конкретным классом C #, провайдером SQL и т. Д. Чтобы избежать этого, следуйте приведенному ниже коду:

[DbConfigurationType(typeof(DBContextConfig))]
partial class 
{

    public Entities(string connectionString)
      : base(connectionString)
    {
    }
}

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