2011-02-06 12 views
10

Para fines de prueba, me gustaría poder eliminar manualmente y volver a crear una base de datos utilizando EF CodeFirst CTP5. ¿Cómo haría esto?EF CodeFirst CTP5 - ¿Soltar manualmente y crear DB?

+0

puede utilizar el Database.SetInitializer, leer en los comentarios aquí http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an -existing-database.aspx –

+0

Sin embargo, regularmente obtendrá la siguiente excepción: No se puede eliminar la base de datos "..." porque está actualmente en uso. Simplemente reinicia VisualStudio y estás bien. Esta característica CodeFirst sigue siendo bastante inestable. – RedGlyph

Respuesta

21

El clase DbDatabase disponible como una característica en su DbContext objeto ofrece un conjunto de métodos para trabajar directamente con la base de datos. Se puede utilizar el Crear y Eliminar método para este asunto:

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

Y no olvide cerrar cualquier conexión a su base de datos (desde Visual Studio o similar) de lo contrario recibirá una excepción diciendo que la base de datos está en uso ... –

+0

Llamando a Database.Connection.Close() antes de Database.Delete() no ayuda. Aún recibe el mensaje de que la base de datos está en uso. – Greg

+1

Greg, eso es porque la base de datos realmente está en uso. Es posible que lo tenga abierto en Server Explorer; intente cerrar esa conexión primero. – mjohnsonengr

2

Comprendo que esto es viejo, pero no pude conseguir la solución aceptado trabajar tan Rodé una solución rápida ...

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); 
     } 
    } 
} 

Esto funciona para mí y ayuda a sembrar fácilmente.

4

Esto funciona para mí pero no dave respuesta con el marco de entidad 5.0. Deberá desencadenar un viaje de base de datos como una consulta para activar la acción.

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

otra parte

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); 

    } 
} 

supongo que también tendrá que añadir 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

Agregué una edición en Dave, pero no sé si se llevará a cabo. Entonces aquí. – hidden

+0

Tenga en cuenta que si el nombre de su base de datos contiene guiones, deberá hacer esto: '[Mi-Nombre de la base de datos-con-guiones]' en la parte 'ExecuteSqlCommand'. –

Cuestiones relacionadas