2011-08-08 27 views
4

在我的代码优先的设置中,我宁愿不让消费者(在这种情况下是网页)能够在设计时删除并重新创建数据库,因为担心我可能会忘记稍后添加适当的逻辑并在脚下自我拍摄(以在创建数据库之前创建具有适当权限的用户)。因此,该网站已与解决方案相关的三个项目:重新生成代码 - 不添加任何数据的第一个数据库

  • 代码第一个项目,其中包含波苏斯和初始化。创建一个DbContext实例有两种不同的方式,一种是将Database.SetInitializer设置为从CreateDatabaseIfNotExists<MyContext>继承的initilizer,另一种方式是DropCreateDatabaseAlways<PanelisternaDbContext>。这种方式我没有得到任何鬼鬼祟祟的下降&重新创建,并希望即使我稍后弄乱了数据库用户的权限,服务器端代码将不会精神和开始删除的东西。

  • 网页项目,或通常任何类型的消费者。这个想法是我在这里创建MyContext,它不会丢失数据库 - 永远。

  • 重置项目,这是一个控制台应用程序,实际上可以删除并重新创建所有内容。它甚至要求我输入一些验证信息,所以我不会意外运行它。

所以,一切都很好。除非我不知道如何实际删除并重新创建数据库,而无需添加任何内容。即下面的代码做什么,我想:

using (var myContext = MyDbContext.GetContext("connectionString", true)) 
//The trailing 'true' marks that the database is to be dropped and recreated. 
{ 
    var user = new User {}; 
    myContext.Users.Add(user); 
    myContext.SaveChanges(); 
    myContext.Users.Remove(user); 
    myContext.SaveChanges(); 
} 

正如你所看到的,我添加和删除一个User对象,以便SaveChanges()确实有事情做。如果我只是做一个SaveChanges()数据库不会删除/重新创建。

所以,我没有进一步说明,我正在寻找一种更简洁的方法来实现数据库重新创建,以及对这种基于重置的解决方案的任何评论或想法。

回答

8

在您的控制台应用程序,你可以把以下内容:

Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>());   
using (var myContext = MyDbContext.GetContext("connectionString")) 
{   
    context.Database.Initialize(force: true);  
} 

这应该强制删除并重新创建,你可以使用自定义的初始化如果需要创建一些初始数据。

+0

正是我一直在寻找,保存为setinitilizer位,我更喜欢在上下文类中处理。谢谢! – Gleno

2

当您初始化DBContext时,您可以检查数据库是否存在,如果不存在则创建它。

public MyDbContext(){ 
    Database.CreateIfNotExists(); 
} 
1

有四种不同的数据库初始化策略:

  1. CreateDatabaseIfNotExists:这是默认初始值。顾名思义,如果每个配置都不存在,它将创建数据库。但是,如果更改模型类,然后使用此初始化器运行应用程序,则会引发异常。
  2. DropCreateDatabaseIfModelChanges:如果模型类(实体类)已更改,此初始化程序将删除现有数据库并创建新数据库。所以当模型类更改时,您不必担心维护数据库模式。
  3. DropCreateDatabaseAlways:顾名思义,这个初始化程序每次运行应用程序时都会丢弃一个现有的数据库,而不管模型类是否发生了变化。当你想要新的数据库时,每次运行应用程序时,这都会很有用,就像开发应用程序时一样。
  4. 如果上述任何一项不满足您的要求,或者您想要使用上述初始化程序初始化数据库,您还可以创建自己的自定义初始化程序。
public class SchoolDBContext: DbContext { 
public SchoolDBContext(): base("SchoolDBConnectionString") 
{ 
    Database.SetInitializer<SchoolDBContext>(new CreateDatabaseIfNotExists<SchoolDBContext>()); 

    //Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseIfModelChanges<SchoolDBContext>()); 
    //Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseAlways<SchoolDBContext>()); 
    //Database.SetInitializer<SchoolDBContext>(new SchoolDBInitializer()); 
} 
public DbSet<Student> Students { get; set; } 
public DbSet<Standard> Standards { get; set; } 
} 

您还可以创建自定义的数据库初始化,通过继承初始化的一个

public class SchoolDBInitializer : CreateDatabaseIfNotExists<SchoolDBContext>{ 
    protected override void Seed(SchoolDBContext context) 
    { 
     base.Seed(context); 
    } 
} 

关闭DB初始化器在代码优先

你也可以关闭应用程序的数据库初始值设定项。假设,在生产环境中,你不想失去现有的数据,那么你就可以关闭初始化,如下面的:

public class SchoolDBContext : DbContext 
{ 
    public SchoolDBContext(): base("SchoolDBConnectionString") 
    { 
     //Disable initializer 
     Database.SetInitializer<SchoolDBContext>(null); 
    } 
    public DbSet<Student> Students { get; set; } 
    public DbSet<Standard> Standards { get; set; } 
} 
相关问题