2016-05-20 9 views
4

Ich habe wie dieses eine Verbindungszeichenfolge war mit meiner Website zu meiner Datenbank verbinden:Wie eine andere Verbindungszeichenfolge verwenden (aber gleiche Datenbank) für Migrationen

<add name="MyDb" 
    connectionString="Data Source=MyDb; 
    Initial Catalog=Staging; 
    User Id=website_staging; 
    Password=secret;" 
    providerName="System.Data.SqlClient" /> 

Der website_staging Benutzer ist ein Mitglied der db_ddladmin Rolle, so dass, wenn ich veröffentliche, und mein Initialisierer läuft, hat es die Berechtigungen erforderlich, um die Datenbank automatisch auf die neueste Version zu migrieren.

Ich mag die Standard-Benutzer-Berechtigungen reduzieren (durch nur auf die db_datareader und db_datawriter Rollen Hinzufügen) und eine Verbindung mit einem anderen Benutzer (in der db_ddladmin Rolle) während der Migration.

So habe ich eine andere Verbindungszeichenfolge mit einem anderen Namen und Benutzer:

<add name="Migrations" 
    connectionString="Data Source=MyDb; 
    Initial Catalog=Staging; 
    User Id=website_staging_migrations; 
    Password=secret;" 
    providerName="System.Data.SqlClient" /> 

Und änderte es den Namen der Verbindungszeichenfolge von dem in meiner DatabaseMigrationConfig Klasse initialisiert Kontext verwendet:

public class DatabaseMigrationConfig 
{ 
    internal static void Register() 
    { 
     using (var context = new MyDbContext(Name="Migrations")) 
     { 
      Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, 
            Migrations.Configuration>()); 
      context.Database.Initialize(false); 
     } 
    } 
} 

Und im Konstruktor meiner Klasse Migrations.Configuration habe ich auch die Verbindungszeichenfolge geändert:

internal sealed class Configuration : DbMigrationsConfiguration<SID2013Context> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     AutomaticMigrationDataLossAllowed = false; 
     string cs = ConfigurationManager.ConnectionStrings["Migrations"].ConnectionString; 
     TargetDatabase = new DbConnectionInfo(cs, "System.Data.SqlClient"); 
    } 
} 

Ich habe dann versucht, die Website zu veröffentlichen. Es scheint, die Verbindungszeichenfolge mit den höheren Rechten korrekt auszuwählen, aber es versucht, die Initial-Migration auszuführen. Wie kann ich damit aufhören?

Antwort

2

Ich löste das schließlich, indem ich den website_staging_migrations Benutzer zu den db_datareader und db_datawriter Rollen sowie der db_ddladmin Rolle hinzufügte.

Der Benutzer muss offensichtlich die Daten in der Tabelle __MigrationHistory lesen. Was warf mich war, dass EF nicht den Fehler berichten die Tabelle als Fehler zuzugreifen und stattdessen bekam ich diesen Fehler, wenn es versucht, die anfängliche Migration ausgeführt wird:

There is already an object named '----' in the database. 

und der Benutzer muss auch die schreiben __MigrationHistory Tabelle. Ich habe diesen Fehler erhalten, bis ich den Benutzer der db_datawriter Rolle hinzugefügt habe:

The INSERT permission was denied on the object '__MigrationHistory', 
database 'Staging', schema 'dbo'. 
Verwandte Themen