2011-02-06 8 views
10

Do celów testowych chciałbym ręcznie usunąć i ponownie utworzyć bazę danych za pomocą EF CodeFirst CTP5. Jak to zrobić?EF CodeFirst CTP5 - Ręcznie upuść i utwórz DB?

+0

można użyć Database.SetInitializer, przeczytaj tutaj http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an komentarzach -existing-database.aspx –

+0

Będziesz jednak regularnie otrzymywać następujący wyjątek: Nie można usunąć bazy danych "...", ponieważ jest ona obecnie używana. Wystarczy ponownie uruchomić VisualStudio i jesteś dobry. Ta funkcja CodeFirst jest wciąż dość niestabilna. – RedGlyph

Odpowiedz

21

DbDatabase klasa dostępny jako własność na swojej DbContext obiekt oferuje zestaw metod do pracy z bazą danych bezpośrednio. Można użyć Tworzenie i Usuń metody dla tej sprawy:

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

I nie zapomnij zamknąć żadnego połączenia z bazą danych (z poziomu Visual Studio), inaczej dostaniesz wyjątek mówiąc, że baza danych jest używana ... –

+0

Wywołanie Database.Donnection.Close() przed Database.Delete() nie pomaga. Nadal masz komunikat, że baza danych jest w użyciu. – Greg

+1

Greg, to dlatego, że baza danych naprawdę jest w użyciu. Możesz go otworzyć w Eksploratorze serwerów - spróbuj najpierw zamknąć to połączenie. – mjohnsonengr

2

Zdaję sobie sprawę, to jest stare, ale nie mogłem dostać przyjętego rozwiązania pracuje tak Przewróciłam szybkie rozwiązanie ...

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

To działa dla mnie i umożliwia łatwe wysiewanie.

4

To działa dla mnie, ale nie dla dave odpowiedzi w ramach encji 5.0. Będziesz musiał wywołać wyskok bazy danych podobny do zapytania, aby uruchomić akcję.

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

indziej

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

    } 
} 

Chyba będzie trzeba także dodać 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

Dodałem komentarz do Dave'a, ale nie wiem, czy to nastąpi. Więc tu. – hidden

+0

Pamiętaj, że jeśli nazwa bazy danych zawiera łączniki, musisz to zrobić: '[My-DatabaseName-with-hyphens]' w części 'ExecuteSqlCommand'. –

Powiązane problemy