web-dev-qa-db-fra.com

Chaîne de connexion d'entité ADO.NET pour plusieurs projets

J'utilise plusieurs projets de couche où DataModel héberge le modèle d'entité ADo.NET et la couche DataAccess effectue la validation.

Cependant chaque fois que je reçois une erreur comme celle-ci 

La connexion nommée spécifiée est introuvable dans la configuration, non destinée à être utilisée avec le fournisseur 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" />

nous avons également essayé d'autres combinaisons pour faire référence au répertoire racine du répertoire du projet appelé, mais sans succès.

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

27
Sumanta

Vous devez mettre ces chaînes de connexion dans chaque fichier app.config des applications. Si vous avez généré un modèle dans un DAL, puis essayez de le consommer dans un fichier 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 copier simplement la chaîne de connexion à partir du DAL dans lequel les modèles ont été générés. Ensuite, chacun aura une copie de cette même chaîne de connexion.

25
Jason Short

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

Ce n'est pas une énorme amélioration, mais au moins, cela vous permet de dissocier certaines 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 nom et la même classe.

Cette nouvelle fonction statique renverra une instance du type souhaité (le descendant de ObjectContext).

Le nouveau fichier est un fichier séparé. Par conséquent, il ne sera pas écrasé si vous recréez les fichiers .edmx et .Designer.cs.

Vous copiez et collez la chaîne de connexion à partir du fichier .config du projet EDM, ce qui est une sorte de piratage, mais au moins, elle 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 fonction statique New_MyEntities () à partir de votre projet appelant.

2
MindModel

Si vous copiez votre fichier App.Config dans le projet principal et remplacez tout le &quot; par le caractère normal ', il doit être exécuté.

2
keith

J'ai passé la chaîne entityconnection à toutes les instances des classes objectContext et à son fonctionnement actuel.

Mais c’est trop, créer une propriété avec connectionstring et la passer comme paramètre à chaque instance

1
Balaji B

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
D.Thouvenin

J'ai eu le même problème et j'ai essayé toutes les méthodes mentionnées. enfin 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 j'ai configuré manuellement la connexion 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 la même exception que mentionnée ci-dessus. donc je l'ai résolu en ajoutant la valeur app.config dans le fichier de configuration Web.

mon fichier web.config final 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
DevT

J'ai eu un problème similaire avec un projet WinForms et malgré tout, tout ce que je pouvais trouver sur le Web ne pouvait pas résoudre mon problème ..... jusqu'à ce que j'ai supprimé le champ que j'utilisais pour mon ObjectContext (private CubEntities _oc = new CubEntities ()) à partir de mon BaseForm à la forme réelle en utilisant. 

0
daveywc

J'ai eu le problème dans l'un de mes projets, car la chaîne de connexion du cadre d'entité était requise par un travail, une application Web et un projet de test. Une façon de gérer cela était la suivante:

1) Utilisez le modèle UnitOfWork (ou un modèle similaire). Cela permet de contrôler la création du 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. Le contexte de données doit permettre une entrée directe de chaîne de connexion:

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

0
Alexei