27

J'utilise un projet multicouche dans lequel le modèle DataModel héberge le modèle d'entité ADo.NET et la couche DataAccess effectue la validation.Chaîne de connexion d'entité ADO.NET pour plusieurs projets

Cependant chaque fois que j'obtiens une erreur comme celui-ci

La connexion spécifiée nom est soit introuvable dans la configuration, ne doit pas être utilisé avec le fournisseur de EntityClient, ou non valide.

J'ai essayé des chaînes de connexion

<add name="SalesEntities" connectionString="metadata=res://*/SalesEntities.csdl|res://*/SalesEntities.ssdl|res://*/SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

et

<add name="SalesEntities" connectionString="metadata=.\SalesEntities.csdl|.\SalesEntities.ssdl|.\SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

ont aussi essayé d'autres combinaisons de renvoyer le répertoire racine du répertoire appelé projet, mais pas de chance.

Toute aide est fortement appréciée. Merci beaucoup comme toujours :).

Répondre

25

Vous devez placer ces chaînes de connexion dans chaque fichier app.config d'applications. Si vous avez un DAL dans lequel vous avez généré le modèle, puis essayez de consommer le DAL dans un EXE, la même chose se produira. Le fichier EXE ne connaît pas la chaîne de connexion. La chose la plus simple que j'ai trouvée est de mettre un app.config sur chaque projet et de simplement copier la chaîne de connexion de la DAL I qui a généré les modèles à l'origine. Ensuite, chacun aura une copie de cette même chaîne de connexion.

+3

hm, est-il en quelque sorte possible de stocker toutes les chaînes de connexion dans un seul endroit, puis « dire » à tous les fichiers web.config où trouver que les chaînes de connexion? – Tony

+0

Vous pouvez les placer dans MACHINE.CONFIG (global sur la machine), mais cela nécessite plus de privations et le déploiement n'est pas une bonne idée dans ce scénario. –

+1

En utilisant une classe partielle, vous pouvez créer votre propre constructeur pour le contexte de données généré pour vos entités et leur demander de définir la chaîne de connexion comme vous le souhaitez. Vous devrez également appeler ce constructeur spécifique où vous instanciez le contexte de données. – jcmcbeth

0

J'ajoute le même problème en essayant de tester mon DAL. J'ai trouvé que cela fonctionne:

<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
0

J'ai eu un problème similaire avec un projet WinForms et malgré les tentatives tout ce que je pouvais trouver en rapport avec sur le web n'a pas pu résoudre mon problème ..... jusqu'à ce que j'enlevé le champ que j'utilisais pour mon ObjectContext (privé CubEntities _oc = new CubEntities()) depuis mon BaseForm vers le formulaire courant en l'utilisant.

2

Si vous copiez votre fichier App.Config dans le projet principal et de remplacer toutes les &quot; avec le caractère ' normal, il devrait fonctionner

1

je suis passé le entityconnectionstring à toutes les instances des classes ObjectContext et son travail maintenant.

Mais son une tête trop, la création d'une propriété avec connectionstring et en passant comme paramètre à chaque instance

2

Je suggère une légère variation sur les suggestions données ci-dessus.

Ce n'est pas une amélioration énorme, mais au moins cela vous donne une certaine séparation des préoccupations. Lorsque l'assistant EF crée le fichier .edmx et son fichier .Designer .cs associé, le code C# déclare une classe partielle.

Vous pouvez donc simplement ajouter un autre fichier .cs au projet contenant les deux fichiers EDM.

Ce nouveau fichier définit une fonction statique supplémentaire pour le même espace de noms et la même classe.

Cette nouvelle fonction statique retournera une instance du type désiré (le descendant de ObjectContext).

Le nouveau fichier est un fichier distinct. Il ne sera donc pas remplacé si vous recréez le fichier .edmx et .Designer.cs.

Vous copiez et collez la chaîne de connexion à partir du fichier .config du projet EDM, qui est une sorte de hack, mais au moins il conserve la chaîne de connexion masquée dans le projet EDM.

Le nouveau fichier ressemble à ceci:

namespace MyNamespace 
{ 
    public partial class MyEntities : ObjectContext 
    { 
    public static MyEntities New_MyEntities() 
    { 
     string connStr; 
     MyEntities theContext; 

     connStr = "metadata=res://*/MyClass.csdl|res://*/MyClass.ssdl|res://*/MyClass.msl;provider=System.Data.SqlClient;provider connection string=\"Data Source=localhost\\SQLSERVER;Initial Catalog=MyDb;Integrated Security=True;MultipleActiveResultSets=True\""; 
     // set the connection string 

     theContext = new MyEntities(connStr); 
     // allocate it 

     return theContext; 
     // return it 
    } 
    } 
} 

Pour obtenir un nouvel objet entités, vous appelez simplement la New_MyEntities fonction statique() de votre projet d'appel.

0

J'ai le même problème & J'ai essayé toutes les méthodes mentionnées. finalement je l'ai résolu comme mentionné. Dans mon cas, j'ai une couche de données et une couche de présentation séparées. dans mon app.config (couche de données) j'ai une connexion comme celle-ci.

<add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

dans mon web.config i connexion configurée manuellement comme suit:

<add name="DefaultConnection" providerName="System.Data.SqlClient" 
connectionString="Data Source=abc; 
Initial Catalog=LibraryMgtSys; 
Integrated Security=SSPI; 
user id=sa;password=123;" /> 

il me donne même exception que mentionné ci-dessus. donc je l'ai résolu en ajoutant la valeur app.config dans le fichier de configuration web.

mon dossier web.config finale comme suit:

<connectionStrings> 
    <clear /> 
    <add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
    <add name="DefaultConnection" providerName="System.Data.SqlClient" 
     connectionString="Data Source=abc; 
     Initial Catalog=LibraryMgtSys; 
     Integrated Security=SSPI; 
     user id=sa;password=123;" /> 
    </connectionStrings> 
0

J'ai eu la question dans l'un de mes projets, en tant que chaîne de connexion Entity Framework a été requis par un emploi, une application web et un projet de test. Une façon de traiter cela était la suivante:

1) Utilisez UnitOfWork (ou un modèle similaire). Cela permet de contrôler la création de contexte de données et de manipuler la chaîne de connexion

public partial class MyContext 
{ 
    #region Members 
    private static readonly object objSync = new object(); 
    private static readonly string DATACONTEXT_KEY = "MyContext_UserInstance"; 
    // TODO: read from a place accesible to all deployed projects 
    // remove hardcoded database 
    private static readonly string DefaultConnectionString = @"metadata=res://*/MyContext.csdl|res://*/MyContext.ssdl|res://*/MyContext.msl;provider=System.Data.SqlClient;provider connection string='data source=Server;initial catalog=MyDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework'"; 

    private static string connectionString; 
    #endregion 

    public MyContext(String connectionString) : base(connectionString) 
    { 
    } 

    /// <summary> 
    /// Uses a UnitOfWorkStore to return the same instance of MyContext, that is unique 
    /// per user, per postback (or CallContext, if not in an HttpContext environment, such as unit tests or console apps) 
    /// </summary> 
    public static MyContext Instance 
    { 
     get 
     { 
      // Dirty (non thread-safe) check 
      if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null) 
      { 
       lock (objSync) 
       { 
        // Thread-safe check 
        if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null) 
        { 
         MyContext context = new MyContext(DefaultConnectionString); 
         connectionString = context.Database.Connection.ConnectionString; 
         UnitOfWorkStore.SetData(DATACONTEXT_KEY, context); 
        } 
       } 
      } 
      return (MyContext)UnitOfWorkStore.GetData(DATACONTEXT_KEY); 
     } 
    } 

} 
  1. contexte de données devrait permettre l'entrée de chaîne de connexion directe:

    MyContext publique (String connectionString): base (connectionString) {}

Questions connexes