Como especificar EntityFramework ProviderName em uma função do Azure
Estou tentando portar algum código de webjob para as novas funções do Azure. Até agora, consegui importar minhas DLLs e referenciá-las com êxito, mas quando uso a cadeia de conexão no meu código, recebo um erro dizendo que tenho que adicionar o ProviderName:
A cadeia de conexão 'ConnectionString' no arquivo de configuração do aplicativo não contém o atributo providerName obrigatório ".
O que normalmente não é um problema porque, em um emprego na Web (ou aplicativo Web), ele estará no App ou Web.config e a cadeia de conexão será simplesmente substituída pelo que eu inseri no Azure.
Com o Azure Functions, não tenho um web.config (embora tentei adicionar um sem sucesso), então, naturalmente, o nome do provedor está ausente.
Como eu especifico isso?
EDITAR: Depois de algumas brincadeiras e algumas dicas úteis das pessoas abaixo, euquase conseguiu fazê-lo funcionar.
O que faço agora é o seguinte:
var connString = **MY CONN STRING FROM CONFIG**; // Constring without metadata etc.
EntityConnectionStringBuilder b = new EntityConnectionStringBuilder();
b.Metadata = "res://*/Entities.MyDB.csdl|res://*/Entities.MyDB.ssdl|res://*/Entities.MyDB.msl";
b.ProviderConnectionString = connString.ConnectionString;
b.Provider = "System.Data.SqlClient";
return new MyDB(b.ConnectionString);
O que me dá o que eu preciso para chamar o banco de dados. Uso um método estático em uma classe parcial para obter uma instância do banco de dados que executa o código acima e decore meu MyDB Partial com[DbConfigurationType(typeof(MyDbConfiguration))]
Eu defino essa configuração como:
public class MyDBConfiguration: DbConfiguration
{
public MyDBConfiguration()
{
SetProviderFactory("System.Data.EntityClient", EntityProviderFactory.Instance);
}
}
Minhasproblema permanece quando eu quero realmente usar as entidades EF. Aqui, ele tentará inicializar o tipo de banco de dadosusando a configuração original, dando-me o erro original mais uma vez. Conforme esse rastreamento de pilha:
at Void Initialize()
at System.Data.Entity.Internal.EntitySetTypePair GetEntitySetAndBaseTypeForType(System.Type)
at Void InitializeContext()
at System.Data.Entity.Core.Objects.ObjectContext CreateObjectContextFromConnectionModel()
at Void Initialize()
at Boolean TryInitializeFromAppConfig(System.String, System.Data.Entity.Internal.AppConfig)
at Void InitializeFromConnectionStringSetting(System.Configuration.ConnectionStringSettings)
assimcomo evito isso? Acho que preciso de uma maneira de me conectar a tudo e executar meu setter personalizado.