1

Ich habe eine Anwendung, die zu context Klassen enthält. Eine ist die Master-Kontextklasse und die zweite ist die Subkontextklasse. Wenn ich die Anwendung zum ersten Mal ausführe, wird die Master-Datenbank generiert. Und jedes Mal, wenn ich einen neuen Benutzer erstelle, wird eine mit diesem Benutzer verbundene Datenbank mit der Subkontextklasse generiert. Wenn ich beispielsweise 10 Benutzer erstelle, werden 10 Datenbanken mit einer Unterkontextklasse wie sub_db_userId generiert.Wie können Migrationen für automatisch generierte Datenbanken hinzugefügt werden?

Das Problem besteht darin, Migrationen in dieser komplexen Struktur zu ermöglichen. Ich weiß, dass einige Leute sagen würden, dass es nicht angemessen ist, eine neue Fremdschlüsselrelation für Datenbanken zu erstellen, aber ich muss an Anforderungen arbeiten.

Ich fand this thread sehr hilfreich bei der Suche, wie Sie Migrationen für separate Kontextklassen aktivieren, aber in meinem Szenario werden keine Änderungen an vorhandenen Datenbanken vorgenommen, weil der Datenbankname den Benutzer-IDs zugeordnet ist. Anstatt Änderungen an bestehenden Kinddatenbanken anzuwenden, erstellt es neue Datenbanken ohne Benutzer-ID wie diese sub_db_. Wie kann ich dieses Problem lösen?

Die Art, wie ich die neue Datenbank für jeden Benutzer erstelle, ist unten angegeben.

Meine Kontextklassen:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) {} 
} 

public class SubDbContext : DbContext 
{ 
    public DbSet<Country> Countries { get; set; } 
    public DbSet<City> Cities { get; set; } 

    public SubDbContext() : base("SubDatabaseConnection") 
    { 
    } 

    public SubDbContext(string connectionString) : base(connectionString) 
    { 
     Database.SetInitializer<SubDbContext>(new 
          CreateDatabaseIfNotExists<SubDbContext>()); 
    } 
} 

Verbindungszeichenfolgen:

<add name="DefaultConnection" 
    connectionString="Data Source=.\SQLExpress;Initial Catalog=master_db;Integrated Security=True" 
    providerName="System.Data.SqlClient" /> 
<add name="SubDatabaseConnection" 
    connectionString="Data Source=.\SQLExpress;Initial Catalog={0};Integrated Security=True" 
    providerName="System.Data.SqlClient" /> 
</connectionStrings> 

Ich verwende {0} für Zwecke der Formatierung. Wie kann ich Migrationen aktivieren und Änderungen an vorhandenen Datenbanken anwenden?

Modifikationen: Ich Verknüpfung Tabellen-Datenbank in Register Aktion wie folgt aus:

SubDbContext newContext = new SubDbContext(string.Format(userDatabase, "sub_db_" + userId)); 
newContext.Countries.FirstOrDefault(); 
newContext.Cities.FirstOrDefault(); 
+0

Kennen Sie alle benutzerspezifischen Datenbanken, die möglicherweise in z. Ihre "Master" -Datenbank (nicht zu verwechseln mit der Master-Datenbank von SQL-Server)? –

+0

Sorry, ich habe dich nicht verstanden? Alle Benutzer sind in meiner Master-Datenbank vorhanden. –

Antwort

1

Ihre DbContext für alle Ihre Unter Datenbanken ist SubDbContext. Daher müssen Sie die Migration basierend auf einem von ihnen aktivieren. setzen Sie diesen Code dann als Configuration Klasse:

internal sealed class Configuration : DbMigrationsConfiguration<SubDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 
} 

und setzt diesen Code in das SubDbContext Konstruktor:

Database.SetInitializer<SubDbContext>(new MigrateDatabaseToLatestVersion<SubDbContext, Configuration>()); 

es bedeutet, wenn jede Datenbank ein neues Handbuch Migration hinzugefügt gefunden, dann versuchen, migrieren Sie es.

und auch können Sie verwenden, um dies approache auch:

schreiben Dieser Code in der Application_Start:

var context = new SubDbContext("your generated connection string"); 
var initializeMigrations = new MigrateDatabaseToLatestVersion<SubDbContext, Configuration>(); 

initializeMigrations.InitializeDatabase(context); 

Ich hoffe, Sie finden es hilfreich.

Verwandte Themen