28

Ich wechselte meine DAL von LINQ über zu Entity Framework. Da meine Anwendung abhängig vom aktuellen Benutzer eine Verbindung zu verschiedenen Datenbanken herstellt, muss ich den DataContext zur Laufzeit dynamisch erstellen und die entsprechende Verbindungszeichenfolge übergeben. Wenn ich jedoch versuchte, eine Entity Framework-Verbindung mithilfe meiner alten Verbindungszeichenfolge programmatisch zu erstellen, schlug die Verbindung fehl. Es beschwerte sich, dass es den Schlüssel in der Verbindungszeichenfolge nicht erkannte, "Server" um genau zu sein.Warum benötigt eine Entity Framework-Verbindung eine Metadateneigenschaft?

Ich fand heraus, dass ich dies zu tun, um benötigen die Entity Framework-Verbindung zur Arbeit zu kommen:

EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
entityBuilder.Provider = "System.Data.SqlClient"; 
entityBuilder.ProviderConnectionString = clientConnectionString; 
entityBuilder.Metadata = "res://*/xxxxxxxxxx.csdl..."; 
Entities entities = new Entities(entityBuilder.ToString()); 

Warum ist das?
Für was ist die Eigenschaft "Metadaten"?
Wird es ein Problem sein, dass es immer gleich für mehrere verschiedene Verbindungen ist?
Was sollte es sein?
Gibt es einen Weg um dies zu umgehen?

Vielen Dank im Voraus!

Update 1: Dank für das Update Randolpho, aber ...
Der ganze Grund, warum ich dieses Problem habe, ist, dass ich nicht die Verbindungszeichenfolgen in einer Konfigurationsdatei speichern kann. Die Verbindungszeichenfolge wird zur Laufzeit dynamisch bestimmt, über die sich der Benutzer verbindet.

Hier mein genaues Szenario ist:
Wenn Benutzer A verbindet, die App-Daten aus der Datenbank A. zieht Wenn Benutzer B verbindet, zieht die App Daten aus der Datenbank B.
Die Verbindungszeichenfolgen in einem Haupt gespeichert werden Datenbank, und die Anzahl ist potenziell unbegrenzt. Jedes Mal, wenn ich einen Benutzer hinzufüge, möchte ich nicht in die web.config gehen müssen, ganz zu schweigen von der Tatsache, dass es irgendwann RIESIG werden würde!

+0

Da die Zuordnungen für jede Verbindung gleich sind und sich nicht ändern, sollte es egal sein, dass ich die gleichen Metadaten für alle richtig verwende? –

+0

ja, das ist richtig – user230910

Antwort

9

Sie diese Links sehr informativ:

http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection.connectionstring.aspx

http://weblogs.asp.net/pgielens/archive/2006/08/21/ADO.NET-Entity-Framework-Metadata.aspx

Unterm Strich? Entity Framework benötigt die Metadaten zum Erstellen Ihrer Entitätszuordnungen.

Darüber hinaus sollten Sie Ihre Verbindungsinformationen lieber in Ihre Konfigurationsdatei verschieben, anstatt sie in Code zu erstellen. Der erste Link zeigt Ihnen, wie Sie das tun.

+2

@ocdecio: EF nicht nur dafür abwerten; NHibernate funktioniert auf die gleiche Weise. Ich bin sicher, dass es andere Gründe gibt. :) – Randolpho

+2

@ocdecio, ich würde gerne einen ORM-Mapper sehen, der keine Art von Mapping-Datei verwendet. Außer du machst 1: 1 mit Tischen etwas was etwas zu sagen hat. – jfar

24

Erweiterung auf Randolpho Antwort:

Die Metadaten-Eigenschaft verweist speziell auf die Lage des .SSDL (Speichermodell,) CSDL (Conceptual Model,) und .MSL (Mapping-Modell) Dateien. Diese drei Dateien sind im Wesentlichen das Entitätsdatenmodell. Das URI-style-Qualifikationsmerkmal "res: //" gibt an, dass die Dateien als Ressourcen in der kompilierten EDM-Assembly eingebettet sind.