2015-09-12 1 views
1

Je développe une application MVC 5 qui utilise d'abord 2 bases de données de code et 1 base de données. Maintenant, je veux déployer et le rendre disponible pour plusieurs clients à travailler. Pour cela, je veux générer ma base de données First Database pour chaque nouveau client. Ma base de données première base de données a 103 tables avec PK, FK et les déclencheurs ont également été construits en eux.Création de plusieurs bases de données en utilisant EF dans MVC et en passant le nom de base de données à InitialCatalogue en tant que variable dans web.config

Mon DbContext est la suivante:

public partial class MyEntities : DbContext 
{ 
    public MyEntities() : base("name=MyEntities") 
    { 
    } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 
    ** Here are my DbSet's ** 
} 

Maintenant, la principale préoccupation est le mien que je veux aussi utiliser MyEntities pour accéder aux bases de données pour chaque client. Parce que tous mes contrôleurs validations accèdent à la base de données avec ce nom d'entité comme suit:

public MyEntities db = new MyEntities(); 

Maintenant, comment pourrais-je être en mesure de créer une nouvelle base de données pour chaque client et le nom du contexte devrait rester même pour que je ne suis pas dois changer mon code dans les contrôleurs? De plus, je dois aussi passer le InitialCatalogue comme variable à web.config pour chaque base de données.

Répondre

2

Comment passer catalogue initial comme nom de variable?

Vous pouvez le faire comme; Tout d'abord, vous allez surcharger votre constructeur d'entités en répondant à la commande sth. Maintenant, lors de la connexion de l'utilisateur, vous devez mettre le nom de la base de données dans une variable de session. Appelons-le "dbName". Alors maintenant vous pouvez y accéder comme:

var connection = System.Configuration.ConfigurationManager.ConnectionStrings["MyDBContext"].ConnectionString; 
var connectionString = string.Format(connection, System.Web.HttpContext.Current.Session["dbName"].ToString()); 
var db = new YourEntities(connectionString); 
db.Database.CreateIfNotExists(); 
3

Vous devez ajouter un plus à votre constructeur DbContext comme suit:

public partial class MyEntities : DbContext 
{ 
    public MyEntities(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 
    } 
} 

Vous devez ajouter ce constructeur dans un fichier séparé * .cs que le précédent est généré automatiquement. Assurez-vous également que l'espace de nom doit être le même que le code généré automatiquement.

Maintenant, vous pouvez instancier la classe DbContext en utilisant la chaîne de connexion de base de données désirée du web.config comme suit:

public MyEntities db = new MyEntities(ConfigurationManager.ConnectionStrings["database1"]); 
+0

Mais comment ce constructeur va créer une nouvelle base de données. Je dois en créer un nouveau avant. –

+0

EF va créer. et graine la base de données pour vous, avec les paramètres corrects. –

+0

Alors, comment passer le paramètre nameOrConnectionString ?? –