2011-02-06 13 views
10

Per scopi di test, vorrei essere in grado di rilasciare manualmente e ricreare un DB utilizzando EF CodeFirst CTP5. Come lo farei?EF CodeFirst CTP5 - Rilasciare manualmente e creare DB?

+0

è possibile utilizzare il Database.SetInitializer, leggere nei commenti qui http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an -existing-database.aspx –

+0

Si otterrà comunque regolarmente la seguente eccezione: Impossibile rilasciare il database "..." perché è attualmente in uso. Riavvia VisualStudio e sei a posto. Questa funzionalità CodeFirst è ancora abbastanza instabile. – RedGlyph

risposta

21

Il DbDatabase classe disponibile come proprietà sulla vostra DbContext oggetto offre una serie di metodi per lavorare direttamente con il database. È possibile utilizzare il Crea e Elimina metodo per questa materia:

using (var context = new YourContext()) 
{ 
    context.Database.Delete(); 
    context.Database.Create(); 
    // Or 
    context.Database.CreateIfNotExists(); 
} 
+3

E non dimenticare di chiudere qualsiasi connessione al tuo database (da Visual Studio o così) altrimenti riceverai un'eccezione dicendo che il database è in uso ... –

+0

Chiama Database.Connection.Close() prima di Database.Delete() non aiuta Viene ancora visualizzato il messaggio che il database è in uso. – Greg

+1

Greg, è perché il database è davvero in uso. Potresti averlo aperto in Esplora server: prova prima a chiudere la connessione. – mjohnsonengr

2

Mi rendo conto che è datato, ma non ho potuto ottenere la soluzione accettata lavorare così ho arrotolato una soluzione rapida ...

using System; 
using System.Data.Entity; 

namespace YourCompany.EntityFramework 
{ 
    public class DropDatabaseInitializer<T> : IDatabaseInitializer<T> where T : DbContext, new() 
    { 
     public DropDatabaseInitializer(Action<T> seed = null) 
     { 
      Seed = seed ?? delegate {}; 
     } 

     public Action<T> Seed { get; set; } 

     public void InitializeDatabase(T context) 
     { 
      if (context.Database.Exists()) 
      { 
       context.Database.ExecuteSqlCommand("ALTER DATABASE " + context.Database.Connection.Database + " SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); 
       context.Database.ExecuteSqlCommand("USE master DROP DATABASE " + context.Database.Connection.Database); 
      } 

      context.Database.Create(); 

      Seed(context); 
     } 
    } 
} 

Questo funziona per me e supporta facilmente la semina.

4

Questo funziona per me, ma non dave risposta con Entity Framework 5.0. Dovrai innescare un viaggio nel database che piace una query per attivare l'azione.

Global.asax 
    Database.SetInitializer<MedicalVarianceDataContext >(new DataInitializer()); 

Altrove

public class DropDatabaseInitializer<T> : IDatabaseInitializer<T> where T : DbContext, new() 
    { 
     public DropDatabaseInitializer(Action<T> seed = null) 
     { 

     } 

    protected virtual void Seed(T context) { } 
    public void InitializeDatabase(T context) 
    { 
     if (context.Database.Exists()) 
     { 
      context.Database.ExecuteSqlCommand("ALTER DATABASE " + context.Database.Connection.Database + " SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); 
      context.Database.ExecuteSqlCommand("USE master DROP DATABASE " + context.Database.Connection.Database); 
     } 

     context.Database.Create(); 
     Seed(context); 

    } 
} 

Credo che si dovrà anche aggiungere context.savechanges();

protected override void Seed(MedicalVarianceDataContext context) 
    { 

     new List<ViewLookUpIndividualUnit>{ 

      new ViewLookUpIndividualUnit{ MvrsIndividualUnit="Clinic" ,Active=true} 


     }.ForEach(k => context.ViewLookUpIndividualUnits.Add(k)); 

     base.Seed(context); 
     context.SaveChanges(); 
    } 
+0

Ho aggiunto una modifica su Dave ma non so se avverrà. Ecco. – hidden

+0

Attenzione che se il nome del tuo database contiene trattini dovrai farlo: '[My-DatabaseName-with-hyphens]' nella parte 'ExecuteSqlCommand'. –

Problemi correlati