2014-06-13 13 views
5

Sto eseguendo lo sviluppo di Code First con Entity Framework 6, utilizzando Migrazioni di database e sto utilizzando un nuovo database popolato con dati seme di esempio. Mi piacerebbe essere in grado di inizializzare il mio database con quei dati seme ogni volta che cambio il modello.Codice EF6 Prime tabelle di rilascio (non intero database) in caso di modifiche del modello

Il problema è questo: non ho il permesso di creare database; per questo motivo, non posso semplicemente utilizzare DropCreateDatabaseIfModelChanges.

C'è un modo in cui posso rilasciare a livello di codice tutti i miei tavoli o sono bloccato manualmente eliminandoli dal database ogni volta?

+0

possibile duplicato del [Ricreare tavoli Entity Framework, e non i database?] (Http://stackoverflow.com/questions/7358673/recreate-entity-framework-tables-not-databases) – TheNorthWes

risposta

3

In definitiva, non avevo bisogno di eliminare le tabelle, solo i dati che contenevano.

Ho risolto questo problema semplicemente troncando un elenco di tabelle all'inizio del metodo Seed, basato su this answer.

protected override void Seed(MyContext context) 
{ 
    var listOfTables = new List<string> { "Table1", "Table2", "Table3" }; 

    foreach (var tableName in listOfTables) 
    { 
     context.Database.ExecuteSqlCommand("TRUNCATE TABLE [" + tableName + "]"); 
    } 

    context.SaveChanges(); 

    // seed data below 
} 
+1

Non hai problemi con i vincoli FK? –

+1

Non ho dovuto troncare tutte le tabelle nella mia situazione e quelle che ho troncato non avevano vincoli FK. Se dovessi preoccuparmi di ciò, mi assicurerei di impostare la mia lista nell'ordine corretto. –

0

Il mio suggerimento è di utilizzare il DB locale o un altro DB su cui si dispone di autorizzazione completa (Azure è bello e gratuito se si dispone di un account MSDN). Quindi migrare lo schema del database finale una volta che è stato impostato su pietra e pronto per la produzione.

Detto questo, this might be helpful, ma non l'ho mai provato prima.

0

Se non si dispone dell'autorizzazione per l'accesso al database, potrebbe essere meglio risolvere il problema. Comunque:

public bool TruncateTable(string connectionString, string schema, string tableName) { 
     var statement = "TRUNCATE TABLE [{0}].[{1}] ;"; 
     statement = string.Format(statement, schema, tableName); 
     return ExecuteSqlStatement(connectionString, statement); 
    } 

    public bool DeleteAllEntriesTable(string connectionString, string schema, string tableName) { 
     var statement = "DELETE FROM [{0}].[{1}] ;"; 
     statement = string.Format(statement, schema, tableName); 
     return ExecuteSqlStatement(connectionString, statement); 
    } 

    public bool ExecuteSqlStatement(string connectionString, string statement, bool suppressErrors = false) { 
     int rowsAffected; 
     using (var sqlConnection = new SqlConnection(connectionString)) { 
      using (var sqlCommand = new SqlCommand(statement, sqlConnection)) { 
       try { 
        sqlConnection.Open(); 
        rowsAffected = sqlCommand.ExecuteNonQuery(); // potential use 
       } 
       catch (Exception ex) { 
        if (!suppressErrors) { 
        // YOUR ERROR HANDLER HERE 
        } 

        return false; 
       } 
      } 
     } 

     return true; 
2

Se non si sta usando le migrazioni automatiche, ma le migrazioni in codice, è possibile eseguire tutta la strada fino alla prima versione utilizzando il seguente comando:

Update-Database –TargetMigration: 0 

questo seguirà il percorso in basso su tutte le migrazioni finché non si dispone di un database pulito. Quindi è possibile eseguire:

Update-Database 

Ciò ripristinerà tutto. Questa soluzione presuppone che tu abbia correttamente gestito il tuo percorso Down e seminato i tuoi dati con le Migrazioni. Lo faccio per i miei test di integrazione per assicurarmi di iniziare con i dati in uno stato previsto.

+0

Speravo che questo sarebbe lavoro per me, ma una delle mie successive migrazioni ha introdotto una proprietà di identità aggiuntiva a una chiave primaria composita (per il supporto 1..n). Idealmente, cancellerei le migrazioni e aggiungerei una nuova migrazione iniziale, ma non sono sicuro che lo schema sia ancora in uno stato finale. –

Problemi correlati