如何防止DbContext改变数据库?

Cro*_*ono 12 .net database orm entity-framework code-first

我正在学习实体框架(目前正在使用EF6 beta),而我正在使用现有数据库上的代码优先模式.DbContext使用T4模板自动创建实体和类.

我想阻止DbContext在运行时创建/更改任何内容到数据库中.

我怎样才能做到这一点?

Adm*_*vić 12

执行enable-migrations命令时,将显示文件夹/迁移,您可以在其中找到名为Configuration.cs的文件.在该文件的构造函数中,默认情况下,有一个属性设置为value:

 AutomaticMigrationsEnabled = false;
Run Code Online (Sandbox Code Playgroud)

这将确保您的数据库不会自动迁移,而是通过手动调用每个迁移.

但是,如果您的数据库大于您的域模型,即您只是在现有数据库的一部分上运行,那么应用程序中的某个位置就会启动(如果它是ASP.NET应用程序,Application_Start事件处理程序),则需要添加以下代码:

Database.SetInitializer<YourDbContext>(null);
Run Code Online (Sandbox Code Playgroud)

否则,实体框架会抱怨域模型中的数据库定义与数据库的实际当前状态不匹配.

编辑:

如果要确保YourDbContext不尝试更改数据库,请执行以下操作:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new YourCustomException("Code first changes are not allowed."); 
}
Run Code Online (Sandbox Code Playgroud)

再次编辑:

我试图了解你想要完成的场景.如果您有现有数据库,并且只想手动更新它,则这是方法:

  1. 使用DbContext生成器模板从现有数据库生成DbContext和实体.
  2. 运行enable-migrations
  3. 添加迁移初始化
  4. 如果一切正常,步骤3应该生成空迁移.你可以删除它.
  5. 现在,无论何时进行某些更改,都需要执行添加迁移ChangeName.除非你做update-database,否则这不会进入数据库.