В целях тестирования я хотел бы вручную удалить и восстановить базу данных с помощью EF CodeFirst CTP5. Как мне это сделать?
EF CodeFirst CTP5 - вручную удалить и создать БД?
Ответ 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);
}
}
}
Это работает для меня и легко поддерживает посев.