我正在创建db并使用下面的代码初始化数据,如果DB不存在,它会创建db并填充它,当我第二次运行应用程序时出现错误
Cannot drop database "aspnet-app" because it is currently in use.
Application_start,带初始化
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Database.SetInitializer(new ComponentDbInitialize());
ComputerContext context = new ComputerContext();
context.Database.Initialize(true); //here it fails on second run
context.SaveChanges();
}
ComputerContext
public ComputerContext():base("name=Default")
{
}
public DbSet<Computer> Computers { get; set; }
public DbSet<Motherboard> Motherboards { get; set; }
public DbSet<CPU> CPUs { get; set; }
public DbSet<Case> Cases { get; set; }
public DbSet<HDD> HDDs { get; set; }
public DbSet<RAM> RAMs { get; set; }
public DbSet<GPU> GPUs { get; set; }
public DbSet<PSU> PSUs { get; set; }
}
初始化课程
public class ComponentDbInitialize : DropCreateDatabaseAlways<ComputerContext>
{
protected override void Seed(ComputerContext context)
{
GetCpu().ForEach(p => context.CPUs.Add(p));
GetGpu().ForEach(p => context.GPUs.Add(p));
GetCase().ForEach(p => context.Cases.Add(p));
GetHdd().ForEach(p => context.HDDs.Add(p));
GetMb().ForEach(p => context.Motherboards.Add(p));
GetPsu().ForEach(p => context.PSUs.Add(p));
GetRam().ForEach(p => context.RAMs.Add(p));
context.SaveChanges();
}
private static List<CPU> GetCpu() .....
private static List<GPU> GetGpu().....
private static List<HDD> GetHdd()....
private static List<Case> GetCase()....
private static List<Motherboard> GetMb()....
private static List<PSU> GetPsu()....
private static List<RAM> GetRam()....
即使用
我也会得到同样的错误context.Database.Initialize(false);
感谢您提供任何帮助/建议
答案 0 :(得分:1)
您的初始化程序正在使用DropCreateDatabaseAlways
类,正如它建议的那样,每次初始化应用程序时都会删除该数据库。
相反,您可以使用CreateDatabaseIfNotExists
或DropCreateDatabaseIfModelChanges
:
public class ComponentDbInitialize : CreateDatabaseIfNotExists<ComputerContext>
{
}