9
votes

Comment spécifier l'entitéFramework Providername dans une fonction Azure

J'essaie de porter du code webjob aux nouvelles fonctions Azure. Jusqu'à présent, j'ai réussi à importer ma DLL et à les référencer avec succès, mais lorsque j'utilise la chaîne de connexion dans mon code, je reçois une erreur disant que je dois ajouter le Name Providern:

La chaîne de connexion 'ConnectionsRing' dans l'application Le fichier de configuration ne contient pas le nom fournisseur requis attribut. " p> blockQuote>

qui n'est normalement pas un problème car dans une application WebJob (ou Web), cela se trouvera dans l'application ou web.config, et les connexions deviennent simplement écrasées avec tout ce que j'ai entré à Azure. P>

avec des fonctions Azure, je n'ai pas de web.config (bien que j'ai essayé d'ajouter un à rien en vain), donc naturellement, le nom d'intention est manquant. p>

Comment puis-je préciser cela? / p>

EDIT: strong> Après avoir joué et quelques conseils utiles par des personnes ci-dessous, je presque em> ont réussi à le faire fonctionner. P>

Ce que je fais maintenant, c'est ce qui suit: P>

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)


0 commentaires

6 Réponses :


0
votes

Vous pouvez accéder aux paramètres de l'application du site en accédant au portail, en cliquant sur les paramètres de l'application de fonction , puis Configurer les paramètres de l'application . Cela ouvrira une lame qui vous permet de définir tous les paramètres de l'application pour votre application de fonction. Il suffit d'utiliser la même clé et la même valeur que vous utiliseriez pour votre web.config.


5 commentaires

Oui, mais pas Providername pour l'entitéFramework, alors comment puis-je préciser cela?


Oh, bon point. Spécifiquement, vous avez besoin de Providername = "System.Data.EntyClient" ? Je pense que même si vous le définissez dans la section "Connections" dans le portail et choisissez "Personnalisé", il tentera de le tirer à partir du web.config - qui, comme vous l'avez dit, vous n'avez pas. Si les autres réponses ici ne vous aident pas, je vais essayer de déterminer s'il y a une autre façon de le faire via des paramètres.


(Lisez-la mal la première fois, d'où la suppression de mon commentaire précédent): Oui, c'est celui dont j'ai besoin. J'essaie de le faire via le code ATM comme suggéré, mais cela semble être quelque chose qui devrait être soutenu dans le portail.


J'ai demandé autour et malheureusement cela semble être une limitation que vous toucherez dans les fonctions. Comme vous l'avez vu, car nous ne vous permettons pas de fournir votre propre web.config, les paramètres de chaîne de connexion ne fonctionnent pas comme prévu lorsque vous devez utiliser «personnalisé». L'approche de code que je vois dans un autre commentaire peut être votre meilleur choix.


Salut Brett. Merci pour le suivi. Je suis à mi-chemin avec une solution sur ef afin qu'il semble viable. PS: J'espère que vous êtes au courant du processus très fastidieux de mise à jour / de suppression de DLL dans le dossier bin de Kudu, car la fichue chose est utilisée par la fonction et vous devez tuer le processus W3WP avant d'être autorisé.



2
votes

en utilisant Cette question Vous pouvez définir votre usine par défaut avant d'ouvrir la connexion en ayant votre dbconfiguration code> de classe code> (voir Link Aussi pour l'utilisation):

[DbConfigurationType(typeof(MyDbConfiguration))] 
public class MyContextContext : DbContext 
{ 
}


12 commentaires

Cela ressemble à une solution appropriée, mais je ne peux pas vraiment le faire fonctionner .. Comment spécifieriez-vous le fichier Providername "System.Data.EntytyClient", mais laissez tout le reste tel qu'il était?


Utilisez-vous ObjectContext et non CodeFirst?


(J'ai appuyé sur Entrée trop vite, d'où la mise à jour du commentaire précédent): Je ne peux apparemment pas comprendre comment définir le nom de l'offre, car cela ne cesse de me dire qu'il manque.


Je suppose que j'utilise ObjectContext? Je génère un contexte d'une base de données existante, donc j'ai un dBContext. Il appelle la configuration personnalisée tout à fait bien, mais je ne sais tout simplement pas quoi écrire pour définir le pays prévu. J'ai essayé: SetProviderFactory ("System.Data.EntyClient", EntityProviderFactory.Instance) en vain.


Essayé par moi-même, ajouter les lignes SetProviderFactory ("system.data.sqlclient", sqlclientfactory.instance); peut aider. J'ai créé un fichier APP.Config complètement vide et j'ai créé une instance SQL.


BTW: Au lieu de web.config, avez-vous essayé d'utiliser app.config?


Depuis que je l'utilise lorsque je le fais dans la configuration de l'application est System.Data.EntyClient, est-ce que cela s'applique toujours? J'ai compris SetProviderFactory ("System.Data.EntityClient", EntityProviderFactory.Instance) remplacerait ce que vous avez essayé. Aussi; Comment fournissez-vous la chaîne de connexion actuelle? Je reçois le mien à partir du fichier de configuration, mais j'ai également essayé simplement de le déconner, il suffit de voir si cela fonctionnait. Il n'a pas :/


Oui, j'ai essayé les deux dans des fonctions d'azur. Cela ne semble pas non plus soutenir?


hmmm ... je lui donne un essai plus tard.


J'ai essayé de faire fonctionner mon application de fonction, mais il semble que j'ai foiré mon compte azur :( Votre commentaire ci-dessus avec SetProviderFactory semble être la bonne approche, si cela ne fonctionne pas, je suis perdu ... peut-être que quelqu'un de MSFT pourrait aider?


Merci d'avoir essayé Stephen. En fait, juste avant que je quitte le travail, j'ai réussi à trouver une configuration de travail. Quand je reviens lundi, je posterai la solution .. Ou bien, cela fonctionnait localement sans le nom de la configuration, j'espère donc que cela fonctionnera dans une fonction;)


Ok @ Stephen-Reindl, j'ai réussi à faire demi-tour en utilisant le code dans mon édition. Mais mon problème reste toujours pour quelques appels selon la modification. C'est plus une question EF maintenant que des fonctions d'azur, alors peut-être que vous pouvez me diriger dans la bonne direction? Merci.



6
votes

À la fin, Stephen Reindel m'a poussé dans la bonne direction; Configuration basée sur le code pour la structure d'entité.

using (var db = MyDB.GetDB()) {
   // db code here.
}


3 commentaires

Pourriez-vous montrer avec plus de détails, comment utiliser cela dans la fonction Azure? Je suis assez nouveau à cela et je ne comprends pas complètement votre solution.


Salut. Je posterai un guide plus sympathique débutant au travail demain (20 heures de 20 heures)


Je ne suis pas tout à fait sûr de la partie de l'explication ci-dessus que vous avez besoin de plus de détails avec, mais j'ai mis à jour la réponse avec quelques explications supplémentaires.



1
votes

Ajout d'une réponse dans l'événement Vous ne pouvez pas simplement modifier votre façon de vous instancier dBContext . Cela se produirait si vous appelez un code qui contient des dBContextes instaré avec le constructeur de paramètres.

Il s'agit d'utiliser un constructeur statique pour lire votre chaîne de connexion des applications dans le portail Azure et la transmettre à votre constructeur de base DBContext. Cela vous permet de contourner la nécessité d'un Providername et vous permet également de conserver l'utilisation de la configuration du portail sans avoir besoin de ne rien faire correspondre.

S'il vous plaît se référer à ma réponse acceptée ici: MANQUANT PROVIDERNAME Lors du débogage Azurfunction ainsi que du déploiement de la fonction Azure


0 commentaires

3
votes

La réponse fournie est parfaite et cela m'a beaucoup aidé mais ce n'est pas dynamique car je ne veux pas avoir du codage sur mes connexions. Si vous travaillez les emplacements dans les fonctions Azure. Je cherchais une solution où je peux utiliser plus de 1 chaînes de connexion. Voici mon approche alternative étape par étape pour que quiconque ait des difficultés à ce problème.

  1. la chose la plus importante est que nous comprenons local.Settings.json dossier N'est pas pour azur. Il est d'exécuter votre application dans le local comme le nom est dire clairement. Alors la solution n'est rien à voir avec ce fichier. P> li>

  2. app.config ou web.config ne fonctionne pas pour les chaînes de connexion de fonction Azure. Si vous avez une bibliothèque de couche de base de données, vous ne pouvez pas écraser la chaîne de connexion en utilisant l'un de ces éléments comme vous le feriez dans les applications ASP.NET. P> LI>

  3. Pour travailler avec, vous devez définir votre chaîne de connexion sur le portail Azure sous les paramètres d'application code> dans votre fonction Azure. Il y a Chaînes de connexion. Là, vous devez copier votre chaîne de connexion de votre dBContext. Si c'est Edmx, cela ressemblera comme ci-dessous. Il y a du type de connexion, je l'utilise sqlazure mais j'ai testé avec mesure (quelqu'un affirmé uniquement fonctionne avec personnalisé) fonctionne avec les deux. p> li> ol>

    métadonnées = res: // /models.mydb.csdl|res:// em> /models.mydb.ssdl|Res://*/models.mydb.msl ;Provider=ystem. Data.sqlclient; fournisseur chaîne de connexion = 'source de données = [Yourdburl]; initiale catalogue = mydb; persister la sécurité info = true; utilisateur Id = xxxx; mot de passe = xxx; multipléactiveresultsetts = true; app = entitéframework p> blockQuote>

    1. Après que vous ayez configuré cela, vous devez lire l'URL dans votre application et fournir le DBContext. DBContext implémente un constructeur avec le paramètre de chaîne de connexion. Par défaut constructeur est sans paramètre mais vous pouvez l'étendre. Si vous utilisez une classe POCO, vous pouvez modifier simplement la classe DBContext. Si vous utilisez des classes EDMX générées par la base de données comme moi, vous ne souhaitez pas toucher la classe EDMX générée automatiquement au lieu de créer une classe partielle dans la même espace de noms et d'étendre cette classe comme ci-dessous. LI> ol>

      Ceci est généré automatiquement dBContext p> xxx pré>

      Il s'agit de la nouvelle classe partielle, vous créez P>

      var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString;
      
      
       using (var dbContext = new myDBEntities(connString))
      {
              //TODO:
      }
      


1 commentaires

Un addendum que je voudrais faire pour cela serait que pour générer correctement le DataContext, vous devrez faire un deuxième projet une bibliothèque .NET. La génération automatique Framework d'entité ne fonctionnera pas correctement dans un projet de fonction Azure.



1
votes

trébuché sur ceci et résolu comme ceci, à l'intérieur de la fonction d'azur.

public static class MyFunction
{
     // Putting this in more than one place in your project will cause an exception,
     // if doing it after the DbConfiguration has been loaded.
     static MyFunction() =>
         DbConfiguration.Loaded += (_, d) =>
             d.AddDefaultResolver(new global::MySql.Data.Entity.MySqlDependencyResolver());


    // The rest of your function...
    //[FunctionName("MyFunction")]
    //public static async Task Run() {}
}


1 commentaires

Oh mon Dieu, j'ai cherché des semaines pour une solution à cela! Merci!