2017-02-28 8 views
1

Ich baue derzeit eine .NET Core Identity Server-Anwendung, die Migrationen verwendet und fragte mich, was die beste Methode zum Seeding einer Datenbank in Bezug auf .NET-Kern wäre.Seeding in .Net Core

Momentan habe ich eine DbInitializer-Klasse, die beim Start (siehe unten) aufgerufen wird, aber fragte mich, ob ich dies als eine Migration tun sollte?

public static void Seed(IApplicationBuilder applicationBuilder) 
    { 
     ConfigurationDbContext context = 
      applicationBuilder.ApplicationServices.GetRequiredService<ConfigurationDbContext>(); 
     IConfiguration oConfig = 
      applicationBuilder.ApplicationServices.GetRequiredService<IConfiguration>(); 

     string sSeedingConfig = GetSeedingConfiguration(oConfig); 

     SeedConfigurationDb(ref context, sSeedingConfig); 
    } 

    private static void SeedConfigurationDb(ref ConfigurationDbContext oContext, string sSeedingConfig) 
    { 
     if (!oContext.ApiResources.Any()) 
     { 
      var oApis = GetSeedingConfigElements(sSeedingConfig, "Apis"); 
      List<ApiResource> lApis = null; 
      if (oApis != null) 
      { 
       lApis = JsonConvert.DeserializeObject<List<ApiResource>>(oApis.ToString()); 
      } 
      if (lApis != null) 
      { 
       foreach (var api in lApis) 
       { 
        oContext.ApiResources.Add(api.ToEntity()); 
       } 
      } 
     } 

     if (!oContext.Clients.Any()) 
     { 
      var oClients = GetSeedingConfigElements(sSeedingConfig, "Clients"); 
      List<Client> lClients = null; 
      if (oClients != null) 
      { 
       lClients = JsonConvert.DeserializeObject<List<Client>>(oClients.ToString()); 
      } 
      if (lClients != null) 
      { 
       foreach (var client in lClients) 
       { 
        oContext.Clients.Add(client.ToEntity()); 
       } 
      } 
     } 

     if (!oContext.IdentityResources.Any()) 
     { 
      var oIdentityResources = GetSeedingConfigElements(sSeedingConfig, "IdentityResources"); 
      List<IdentityResource> lIdentityResources = null; 
      if (oIdentityResources != null) 
      { 
       lIdentityResources = JsonConvert.DeserializeObject<List<IdentityResource>>(oIdentityResources.ToString()); 
      } 
      if (lIdentityResources != null) 
      { 
       foreach (var identityresource in lIdentityResources) 
       { 
        oContext.IdentityResources.Add(identityresource.ToEntity()); 
       } 
      } 
     } 

     oContext.SaveChanges(); 
    } 

Antwort

4

Wenn Sie Ihre Migrationen aktivieren, erhalten Sie eine Klassendatei namens "Configuration". Diese Klasse verfügt über eine Startmethode, die bei jeder Aktualisierung der Datenbank durch eine Migration ausgeführt wird.

So könnten Sie Ihre erste Aktualisierung durch dort säen, und dann kommentieren Sie es aus.

+0

Ich habe tatsächlich den folgenden Befehl ausgeführt, um meine Datenbank 'dotnet ef migrations hinzufügen InitialIdentityServerMigration -c ConfigurationDbContext' zu erstellen. Diese Methode hat standardmäßig keine Konfigurationsklasse erstellt, daher wusste ich nicht, ob sich die Implementierung geringfügig vom neuen Framework unterscheidet. Ich weiß in früheren Framework-Versionen, dass dies immer der Weg war, den Seeding-Prozess durchzuführen, aber .NET-Core braucht etwas Zeit, um sich daran zu gewöhnen. – GSkidmore

+1

@GSkidmore überprüfen Sie diese: http://www.dalsoft.co.uk/blog/index.php/2016/12/13/entity-framework-core-seeding-using-migrations/, es ist eine Arbeit um zu säen mit Migrationen, bis EF Core die Funktionalität hinzufügt, sollte dies den Trick tun. – TanguyB

+0

Brilliant danke, wirklich zu schätzen! – GSkidmore