Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EF CodeFirst CTP5 - Manually drop and create DB?

For testing purposes I would like to manually be able to drop and recreate a DB using EF CodeFirst CTP5. How would I do this?

like image 500
BenGC Avatar asked Feb 06 '11 03:02

BenGC


3 Answers

The DbDatabase class available as a property on your DbContext object offers a set of methods for directly working with database. You can use the Create and Delete method for this matter:

using (var context = new YourContext())
{
    context.Database.Delete();
    context.Database.Create();
    // Or
    context.Database.CreateIfNotExists();
}
like image 82
Morteza Manavi Avatar answered Nov 13 '22 00:11

Morteza Manavi


This works for me but not dave answer with entity framework 5.0. You will have to trigger a database trip that like a query in order to trigger the action.

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

Elsewhere

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

    }
}

I guess you will also need to add 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(); 
    }
like image 27
hidden Avatar answered Nov 12 '22 23:11

hidden


I realize this is dated but I couldn't get the accepted solution working so I rolled a quick solution...

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

This works for me and supports seeding easily.

like image 2
Dave Jellison Avatar answered Nov 13 '22 01:11

Dave Jellison