2011-02-06 18 views
10

Với mục đích thử nghiệm, tôi muốn tự có thể thả và tạo lại một DB bằng EF CodeFirst CTP5. Làm thế nào tôi sẽ làm điều này?EF CodeFirst CTP5 - Thả thủ công và tạo DB?

+0

bạn có thể sử dụng Database.SetInitializer, đọc trong các ý kiến ​​ở đây http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an -existing-database.aspx –

+0

Bạn sẽ thường xuyên nhận được ngoại lệ sau đây mặc dù: Không thể thả cơ sở dữ liệu "..." vì nó hiện đang được sử dụng. Chỉ cần khởi động lại VisualStudio và bạn tốt. Tính năng CodeFirst này vẫn còn khá không ổn định. – RedGlyph

Trả lời

21

Lớp DbDatabase là một thuộc tính trên đối tượng DbContext của bạn cung cấp một tập hợp các phương thức để làm việc trực tiếp với cơ sở dữ liệu. Bạn có thể sử dụng TạoXóa phương pháp cho vấn đề này:

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

Và đừng quên đóng mọi kết nối đến cơ sở dữ liệu của bạn (từ bên trong Visual Studio hay như vậy), nếu không bạn sẽ nhận được một ngoại lệ nói rằng cơ sở dữ liệu đang được sử dụng ... –

+0

Gọi Database.Connection.Close() trước Database.Delete() không giúp được gì. Bạn vẫn nhận được thông báo rằng cơ sở dữ liệu đang được sử dụng. – Greg

+1

Greg, đó là vì cơ sở dữ liệu thực sự đang được sử dụng. Bạn có thể mở nó trong Server Explorer - trước tiên hãy thử đóng kết nối đó. – mjohnsonengr

2

Tôi nhận ra điều này là ngày nhưng tôi không thể có được giải pháp chấp nhận làm việc vì vậy tôi lăn ra một giải pháp nhanh chóng ...

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

Điều này phù hợp với tôi và hỗ trợ việc tạo hạt dễ dàng.

4

Điều này phù hợp với tôi nhưng không phải là câu trả lời dave với khung pháp nhân 5.0. Bạn sẽ phải kích hoạt một chuyến đi cơ sở dữ liệu giống như một truy vấn để kích hoạt hành động.

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

Ở những nơi khác

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

    } 
} 

Tôi đoán bạn cũng sẽ cần phải thêm 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

Tôi đã thêm một chỉnh sửa trên Dave nhưng không biết nếu nó sẽ diễn ra. Nên ở đây. – hidden

+0

Hãy coi chừng nếu tên cơ sở dữ liệu của bạn chứa dấu gạch nối, bạn sẽ cần phải làm điều này: '[My-DatabaseName-with-hyphens]' trong phần 'ExecuteSqlCommand'. –

Các vấn đề liên quan