EF CodeFirst CTP5 - вручную сбросить и создать БД? - PullRequest
10 голосов
/ 06 февраля 2011

В целях тестирования я хотел бы иметь возможность вручную удалять и воссоздавать БД с помощью EF CodeFirst CTP5. Как бы я это сделал?

Ответы [ 3 ]

21 голосов
/ 07 февраля 2011

Класс DbDatabase , доступный как свойство вашего объекта DbContext , предлагает набор методов для непосредственной работы с базой данных. Для этого вы можете использовать метод Создать и Удалить :

using (var context = new YourContext())
{
    context.Database.Delete();
    context.Database.Create();
    // Or
    context.Database.CreateIfNotExists();
}
4 голосов
/ 18 сентября 2012

Это работает для меня, но не для ответа Дэйва с помощью Entity Framework 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 голосов
/ 25 мая 2012

Я понимаю, что оно устарело, но я не смог заставить работать принятое решение, поэтому я нашел быстрое решение ...

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

Это работает для меня и легко поддерживает посев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...