Подтвердить что ты не робот

EF CodeFirst CTP5 - вручную удалить и создать БД?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Это работает для меня, но не отвечает на сущность 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(); 
    }

Ответ 3

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

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

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