无需添加任何数据即可重新生成Code-First数据库

Gle*_*eno 4 c# entity-framework ef-code-first

在我的代码优先设置中,我不希望消费者(在这种情况下是一个网页)能够在设计时删除并重新创建数据库,因为我担心以后会忘记添加适当的逻辑并进行拍摄我自己在脚下(为了在上线前创建具有适当权限的数据库用户).因此,该网站有三个与该解决方案相关的项目:

  • Code First Project,包含POCO和初始化程序.有两种截然不同的创建的DbContext实例,一个用来设置的方式Database.SetInitializer来继承从initilizer CreateDatabaseIfNotExists<MyContext>及其他方式不具有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();
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在添加和删除一个User对象,以便SaveChanges()实际上可以执行某些操作.如果我只是做一个SaveChanges()数据库将不会删除/重新创建.

所以,不用多说,我正在寻找一种更简洁的方法来实现数据库娱乐,以及对这种基于重置的解决方案的任何评论或想法.

Ale*_*son 8

在您的控制台应用程序中,您可以输入以下内容:

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

这应该强制删除并重新创建,如果需要,您可以使用自定义初始值设定项创建一些初始数据.