EF Code First CTP5 - 手动删除并创建数据库?

时间:2011-02-06 03:20:32

标签: entity-framework

出于测试目的,我想手动使用EF CodeFirst CTP5删除并重新创建数据库。我该怎么做?

3 个答案:

答案 0 :(得分:21)

DbDatabase 类作为 DbContext 对象的属性提供,提供了一组直接使用数据库的方法。您可以使用创建删除方法:

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

答案 1 :(得分:4)

这适用于我,但不是dave回答实体框架5.0。您必须触发像查询一样的数据库脱机才能触发操作。

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

其他地方

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

    }
}

我猜你还需要添加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(); 
    }

答案 2 :(得分:2)

我意识到这已经过时,但我无法使用已接受的解决方案,所以我推出了快速解决方案......

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

这对我有用,并且很容易支持播种。