wake-up-neo.com

ADO.NET-Entity-Verbindungszeichenfolge für mehrere Projekte

Ich verwende ein mehrschichtiges Projekt, bei dem das DataModel das ADo.NET Entity-Modell hostet und die DataAccess-Schicht die Überprüfung durchführt.

Ich bekomme jedoch jedes Mal eine solche Fehlermeldung 

Die angegebene benannte Verbindung wurde entweder nicht in der Konfiguration gefunden, ist nicht für die Verwendung mit dem EntityClient-Anbieter vorgesehen oder nicht gültig.

Ich habe Verbindungszeichenfolgen versucht

<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" /> 

und 

<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" />

versuchte auch andere Kombinationen, um auf das Stammverzeichnis des aufgerufenen Projektverzeichnisses zu verweisen, aber kein Glück.

Jede Hilfe wird sehr geschätzt. Vielen Dank wie immer :). 

27
Sumanta

Sie müssen diese Verbindungszeichenfolgen in jede Anwendungsdatei app.config einfügen. Wenn Sie über eine DAL verfügen, in der Sie das Modell erstellt haben, und dann versuchen, die DAL in einer EXE-Datei zu konsumieren, wird dasselbe geschehen. Die EXE-Datei kennt die Verbindungszeichenfolge nicht.

Die einfachste Sache, die ich gefunden habe, ist, eine app.config in jedes Projekt einzufügen und einfach die Verbindungszeichenfolge aus der DAL zu kopieren, in der ich die Modelle ursprünglich erstellt habe. Dann hat jeder eine Kopie dieser Verbindungszeichenfolge.

25
Jason Short

Ich schlage eine leichte Abweichung von den oben genannten Vorschlägen vor.

Es ist keine große Verbesserung, aber zumindest gibt es eine gewisse Trennung der Bedenken.

Wenn der EF-Assistent die .edmx-Datei und die zugehörige .Designer.cs-Datei erstellt, deklariert der C # -Code eine Teilklasse. Sie können also einfach eine weitere.cs-Datei zu dem Projekt hinzufügen, das die beiden EDM-Dateien enthält.

Diese neue Datei definiert eine zusätzliche statische Funktion für denselben Namespace und dieselbe Klasse.

Diese neue statische Funktion gibt eine Instanz des gewünschten Typs (der Nachkommen von ObjectContext) zurück.

Die neue Datei ist eine separate Datei. Sie wird also nicht überschrieben, wenn Sie .edmx und .Designer.cs neu erstellen.

Sie kopieren die Verbindungszeichenfolge aus der .config des EDM-Projekts und fügen sie ein. Dies ist eine Art Hack, aber zumindest bleibt die Verbindungszeichenfolge im EDM-Projekt verborgen.

Die neue Datei sieht folgendermaßen aus:

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
    }
  }
}

Um ein neues Entitätsobjekt zu erhalten, rufen Sie einfach die statische Funktion New_MyEntities () aus Ihrem aufrufenden Projekt auf.

2
MindModel

Wenn Sie Ihre App.Config-Datei in das Hauptprojekt kopieren und alle &quot; durch das normale '-Zeichen ersetzen, sollte es ausgeführt werden

2
keith

Ich habe den Entityconnection-String an alle Instanzen der objectContext-Klassen übergeben und funktioniert jetzt.

Es ist jedoch ein zu großer Aufwand, wenn eine Eigenschaft mit connectionstring erstellt und als Parameter an jede Instanz übergeben wird

1
Balaji B

Ich füge das gleiche Problem hinzu und versuche, meine DAL-Einheit zu testen. Ich habe festgestellt, dass dies funktioniert: 

<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

Ich habe dasselbe Problem und ich habe alle genannten Methoden ausprobiert. endlich löste ich es wie erwähnt. In meinem Fall habe ich eine separate Datenschicht und Präsentationsschicht. in meinem app.config (datenschicht) habe ich eine solche verbindung.

 <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" />

in meinem web.config habe ich die Verbindung wie folgt manuell konfiguriert:

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

es gibt mir die gleiche Ausnahme wie oben erwähnt. so löste ich es durch Hinzufügen von app.config-Wert in der Web-Konfigurationsdatei.

meine endgültige web.config-Datei wie folgt:

<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

Ich hatte ein ähnliches Problem mit einem WinForms-Projekt, und obwohl ich alles versucht hatte, was ich im Web finden konnte, konnte ich mein Problem nicht lösen ... bis ich das Feld entfernte, das ich für ObjectContext (private CubEntities _oc = new) verwendete CubEntities ()) von meiner BaseForm zum eigentlichen Formular, das es verwendet. 

0
daveywc

Ich hatte das Problem in einem meiner Projekte, da die Verbindungszeichenfolge des Entity Frameworks für einen Job, eine Webanwendung und ein Testprojekt erforderlich war. Eine Möglichkeit, damit umzugehen, war die folgende:

1) Verwenden Sie das UnitOfWork-Muster (oder ein ähnliches Muster). Auf diese Weise können Sie die Erstellung des Datenkontexts steuern und die Verbindungszeichenfolge bearbeiten

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. Der Datenkontext sollte die Eingabe einer direkten Verbindungszeichenfolge ermöglichen:

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

0
Alexei