2017-03-21 1 views
0

Nous avons une base de données (MySQL) dites DemoDB. Nous avons différents comptes utilisant le db. Donc, un db pour chaque compte est créé, disons Account1DB, Account2DB. Les tables Les procédures stockées et les fonctions sont toutes identiques. Nous devons développer une API Web et fournir un service pour l'insertion et la mise à jour des données. L'utilisateur se connecte en spécifiant AccountName (par exemple à partir d'une application WPF où les champs sont UserName, Password et Account ComboBox). Nous devons définir le catalogue initial de la chaîne de connexion sur le compte auquel l'utilisateur se connecte (en fait, nous devons définir le catalogue initial avant même de se connecter à l'utilisateur car nous devons vérifier ses informations d'identification en fonction du compte).Définissez ConnectionString pour EntityFramework par programme.

Exemple WPF écran:

UserName: A

Mot de passe: secret

compte: Account1

Lorsque l'utilisateur clique sur connexion ce que je voudrais faire:

1: -> Définir le catalogue initial dans la chaîne de connexion à Account1DB

2: -> Ensuite, toutes les opérations de DB (y compris l'authentification) l'utilisateur doit être sur le schéma Account1DB

Je voudrais aller avec l'approche de base de données. Comment une approche cela?

Merci à l'avance,

Abhilash D K

Répondre

1

Vous pouvez modifier vous classe dérivée de DbContext prendre connectionString comme paramètre et le transmettre à la base constructeur DbContext.

public partial class MyContext : DbContext 
{ 
    public MyContext() : base("name=MyDbName") 
    { 
    } 

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

    // Class members 
} 

Ensuite, vous pouvez utiliser quelque chose comme usine de chaîne de connexion:

public class ConnectionStringFactory 
{ 
    public string GetConnectionString(string initialCatalog) 
    { 
     SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); 
     builder.InitialCatalog = initialCatalog; 

     // Set another connection parameters 

     return builder.ToString(); 
    } 
} 

Maintenant, vous pouvez travailler avec des contextes distincts, vérifier les informations d'identification et d'effectuer toutes les opérations DB, quelque chose comme ceci:

ConnectionStringFactory factory = new ConnectionStringFactory(); 
    string connectionString = factory.GetConnectionString("Account1DB"); 
    MyContext context = new MyContext(connectionString); 
+0

Bonjour Réservoirs pour la réponse Je vais essayer de vous le faire savoir :) –

+0

Hi Où dois-je appeler la méthode GetConnectionString()? En créant un objet de la classe MyContext, n'est-ce pas? –

+0

Bonjour. J'ai édité mon post pour montrer un exemple. Vous devriez remarquer que la méthode 'GetConnectionString' n'est pas complètement implémentée dans mon exemple. Bien que je ne connaisse pas de véritable raison de faire de telles choses, je vous conseille d'utiliser les utilisateurs et les droits de la base de données. Utiliser une base de données distincte pour chaque utilisateur ne semble pas être le meilleur choix. –

0

Vous pouvez changer de cours mais pas de préférence. Il peut être une exception de lancer à l'exécution sans message approprié, j'ai challanged comme cette situation. Vous changez comme ceci;

DbContext source; //i assumed you created on 

var entitysb= new EntityConnectionStringBuilder 
       (System.Configuration.ConfigurationManager 
        .ConnectionStrings["EntityConnection"].ConnectionString); 

var sqlsb = new SqlConnectionStringBuilder 
       (entitysb.ProviderConnectionString); 
source.Database.Connection.ConnectionString 
       = sqlsb.ConnectionString; 
+0

Pour éviter les exceptions, la chaîne de connexion doit être transmise au constructeur. –

+0

par défaut, si vous n'avez défini aucun nom, il doit s'agir de "defaultconnection". –

+0

Salut Tanks pour la réponse, je vais essayer et vous le faire savoir :) –