Configurer Entity Framework pour une chaîne de connexion dynamic

Je travaille sur une application qui utilisera le même schéma de firebase database sur plusieurs bases de données. Pour cette raison, j’ai créé une firebase database appelée MyTemplate . Lorsqu’un nouvel utilisateur est créé, il dispose de sa propre instance de la firebase database. Ainsi, une firebase database appelée quelque chose comme MyTemplate_[UserName] sera créée. Lorsqu’un utilisateur se connecte, je dois orienter ses requêtes vers sa firebase database. Pour cette raison, je sais que je dois définir la chaîne de connexion au moment de l’exécution. Mon problème est, je veux aussi utiliser Entity Framework.

Actuellement, j’ai créé un nouveau .edmx en utilisant MyTemplate comme source. Je pensais pouvoir mettre à jour le code et définir la chaîne de connexion à cet endroit. Malheureusement, je n’arrive pas à comprendre comment le régler. Le constructeur de TemplateEntities n’a pas de surcharge qui me permet de passer une chaîne de connexion. J’ai remarqué que TemplateEntities dérive de DbContext, je ne pense pas que ce soit le problème.

 ssortingng connectionSsortingng = GetUsersConnectionSsortingng(); using (TemplateEntities entities = new TemplateEntities()) { TemplateEntity entity = new TemplateEntity(); // Save to the database entities.TemplateEntity.Add(entity); entities.SaveChanges(); } 

Est-ce que je crée le .edmx manière incorrecte? Ou est-ce que je manque quelque chose entièrement? Tout ce que je présente dans Google indique une surcharge qui devrait autoriser la transmission d’une chaîne de connexion. Toutefois, cette surcharge ne me est pas disponible.

La classe TemplateEntities générée est marquée comme partial .

Tout ce que vous avez à faire est d’append un autre fichier avec une autre partie de la définition de classe partielle qui expose le constructeur que vous souhaitez utiliser:

 partial class TemplateEntities { public TemplateEntities( ssortingng nameOrConnectionSsortingng ) : base( nameOrConnectionSsortingng ) { } } 

Ensuite, passez votre chaîne de connexion à ce constructeur.

Vous souhaitez placer ce code dans un fichier différent afin qu’il ne soit pas écrasé lorsque vous mettez à jour votre modèle edmx.

La réponse de Nicholas Butler est tout à fait correcte. En plus de ce qu’il a dit, j’ai été confronté au problème de prendre une chaîne de connexion existante pour la structure d’entité et de la pointer simplement vers une firebase database différente ayant la même structure. J’ai utilisé le code suivant pour modifier uniquement la source de données de la chaîne existante:

 var originalConnectionSsortingng = System.Configuration.ConfigurationManager.ConnectionSsortingngs["CSName"].ConnectionSsortingng; var ecsBuilder = new EntityConnectionSsortingngBuilder(originalConnectionSsortingng); var sqlCsBuilder = new SqlConnectionSsortingngBuilder(ecsBuilder.ProviderConnectionSsortingng) { DataSource = "newDBHost" }; var providerConnectionSsortingng = sqlCsBuilder.ToSsortingng(); ecsBuilder.ProviderConnectionSsortingng = providerConnectionSsortingng; ssortingng contextConnectionSsortingng = ecsBuilder.ToSsortingng(); using (var db = new SMSContext(contextConnectionSsortingng)) { ... } 

C’est l’étape par étape que j’ai utilisée pour construire mes solutions:

  1. Sur votre projet souhaité, assurez-vous qu’Entity Framework a été installé à l’aide du menu d’options “Gérer les packages de nugets …”.
  2. Sur le projet de votre choix, cliquez avec le bouton droit de la souris, puis sur Ajouter-> Nouvel élément, accédez à Données et sélectionnez Modèle de données d’entité ADO.NET.
  3. Tapez le nom du modèle, disons “ExampleModel”. Cliquez sur Ajouter.
  4. Quatre choix apparaissent pour choisir le contenu du modèle. Je sélectionne généralement le premier afin de construire le modèle à partir d’objects existants de la firebase database. Cliquez sur Suivant.
  5. Définissez votre connexion de données. Une fois cela fait, tapez le nom de votre entité de modèle, disons “ExampleModelEntities”, cliquez sur Suivant.
  6. Sélectionnez les objects de la firebase database qui seront présents sur votre modèle EF. Dans la zone de saisie Model Namespace, entrez le même nom de modèle qu’à l’étape 3 (“ExampleModel”). Cliquez sur Terminer.

À ce stade, un nouveau fichier .edmx a été créé et ajouté au projet, contenant tous vos objects prêts à l’emploi. Seuls les détails non souhaités sont, jusqu’à présent, la chaîne de connexion a été spécifiée et enregistrée dans le fichier Web.config de notre projet.

Pour le supprimer, accédez simplement au bloc de section de votre fichier Web.config et supprimez les détails à partir de là. Nous allons maintenant travailler à rendre la chaîne de connexion lisible de manière dynamic à partir d’autres sources.

Comme l’a souligné Nicholas Butler, la prochaine étape consistera à créer une “version” de la classe d’entité partielle d’origine créée (ExampleModelEntities), qui nous permettra de transmettre la chaîne de connexion dynamic. Cela est possible car la classe d’entité originale créée hérite de DBContext, c’est-à-dire celle qui contient le constructeur pour passer cette connexion.

Pour ce faire, ajoutez une nouvelle classe vide à votre projet. Assurez-vous de saisir le même nom que celui fourni à l’étape 5, à la suite de notre étude de cas “ExampleModelEntities”. Ci-dessous le code à implémenter:

C #

 public partial class ExampleModelEntities { public ExampleModelEntities(ssortingng connSsortingng) : base(connSsortingng) { } } 

VB.Net:

 Partial Public Class ExampleModelEntities Public Sub New(ByVal connSsortingng As Ssortingng) MyBase.New(connSsortingng) End Sub End Class 

À ce moment, votre code est prêt à fonctionner avec des chaînes de connexion dynamics provenant d’autres sources. L’une de ces sources peut être la transmission d’une chaîne de connexion provenant d’un autre champ stocké dans une firebase database différente ou à l’aide de la classe EntityConnectionSsortingngBuilder .

L’exemple suivant est implémenté dans VB.Net, mais veuillez utiliser un outil tel que Telerik pour traduire. Supposons que nous obtenons une liste d’objects d’une certaine firebase database. Seulement, nous voulons transmettre de manière dynamic la chaîne de connexion provenant d’un autre champ stocké dans une autre firebase database. Pour ce faire, le code ressemblerait à ceci:

 Public Shared Function Get_List(ByVal Param1 As Ssortingng) As List(Of Stored_Procedure_Code_Result) Try Dim Object_List_Result As List(Of Stored_Procedure_Code_Result) = Nothing Using dbContext As New ExampleModelEntities(Configuration.CONNECTION_STRING) Object_List_Result = dbContext.Stored_Procedure_Code(Param1).ToList dbContext.Dispose() End Using Return Object_List_Result Catch ex As Exception Throw ex End Try End Function 

Configuration.CONNECTION_STRING est la valeur de la chaîne de connexion dynamic, exprimée à l’aide d’un module appelé “Configuration” et d’une fonction qui récupère cette valeur.

Afin d’éviter les inexactitudes de format, la valeur doit être stockée en utilisant le format suivant:

Pour l’authentification Windows à l’aide d’Entity Framework:

 UPDATE [DBConnections].[dbo].[ListOfConnectionsTable] SET ConnValue = 'metadata=res://*/ExampleModel.csdl|res://*/ExampleModel.ssdl|res://*/ExampleModel.msl;provider=System.Data.SqlClient;provider connection ssortingng="Data Source=ServerName;Initial Catalog=DBName;Integrated Security=True"' 

Pour l’authentification SQL à l’aide d’Entity Framework:

 UPDATE [DBConnections].[dbo].[ListOfConnectionsTable] SET ConnValue = 'metadata=res://*/ExampleModel.csdl|res://*/ExampleModel.ssdl|res://*/ExampleModel.msl;provider=System.Data.SqlClient;provider connection ssortingng="Persist Security Info=False;User ID=XXXXXX;Password=XXXXXXX;Initial Catalog=DBName;Data Source=ServerName;App=YourAppName;Network Library=dbmssocn"' 

Enfin, pour étendre la réponse fournie par Mark, chez Microsoft , une explication détaillée explique comment utiliser la classe EntityConnectionSsortingngBuilder, qui peut également être utilisée pour créer des chaînes de connexion dynamics, puis transmettre cette valeur à la demande.