28

J'ai basculé mon DAL de l'utilisation de LINQ vers Entity Framework. Étant donné que mon application se connecte à différentes bases de données en fonction de l'utilisateur actuel, je dois créer dynamiquement le DataContext au moment de l'exécution et transmettre la chaîne de connexion appropriée. Toutefois, lorsque j'ai essayé de créer par programme une connexion Entity Framework à l'aide de mon ancienne chaîne de connexion, la connexion a échoué. Il s'est plaint qu'il n'a pas reconnu la clé dans la chaîne de connexion, "serveur" pour être exact.Pourquoi une Entity Framework Connection nécessite-t-elle une propriété de métadonnées?

Je trouve que je devais faire ceci afin d'obtenir la connexion Entity Framework au travail:

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

Pourquoi est-ce?
À quoi sert la propriété Métadonnées?
Est-ce que le problème est toujours le même pour plusieurs connexions différentes?
Que devrait-il être?
Y a-t-il un moyen de contourner cela?

Merci d'avance!

Mise à jour 1: Merci pour la mise à jour Randolpho, mais ...
La seule raison pour laquelle je vais avoir ce problème, est que je ne peux pas stocker les chaînes de connexion dans un fichier de configuration. La chaîne de connexion est déterminée dynamiquement au moment de l'exécution par l'utilisateur qui se connecte.

Voici mon scénario exact:
Si l'utilisateur A se connecte, l'application extrait des données de base de données A. Si l'utilisateur B se connecte, l'application extrait des données de base de données B.
Les chaînes de connexion sont stockées dans une principale base de données, et le nombre est potentiellement illimité. Chaque fois que j'ajoute un utilisateur, je ne veux pas avoir à aller dans le web.config, pour ne pas mentionner le fait que ça finirait par devenir ÉNORME!

+0

Étant donné que les mappages sont les mêmes pour chaque connexion, et qu'il ne changera pas, cela ne devrait pas d'importance que j'utilise les mêmes métadonnées pour tous les droits? –

+0

oui c'est correct – user230910

Répondre

9

Vous trouverez ces liens très instructifs:

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

Bottom line? Entity Framework a besoin des métadonnées pour créer vos mappages d'entité.

De plus, vous devriez envisager de transférer vos informations de connexion vers votre fichier de configuration plutôt que de les compiler en code. Le premier lien vous montrera comment faire cela.

+2

@ocdecio: Ne pas oublier EF juste pour cela; NHibernate fonctionne à peu près de la même manière. Je suis sûr qu'il y a d'autres raisons, cependant. :) – Randolpho

+2

@ocdecio, J'aimerais voir un mappeur ORM qui n'utilise pas de fichier de mapping. À moins de faire 1: 1 avec des tables, quelque chose doit dire quelque chose à faire. – jfar

24

L'expansion sur la réponse Randolpho:

La propriété métadonnées pointe spécifiquement à l'emplacement du .SSDL (Modèle de stockage), les fichiers .CSDL (modèle conceptuel,) et .msl (Mapping Model). Ces trois fichiers sont essentiellement le modèle de données d'entité. Le qualificateur de style URI "res: //" indique que les fichiers sont incorporés en tant que ressources dans l'assembly EDM compilé.