如何防止DbContext改变数据库?

时间:2013-09-18 03:48:38

标签: .net database entity-framework orm code-first

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

我想阻止DbContext在运行时创建/修改数据库中的任何内容。

我该怎么做?

3 个答案:

答案 0 :(得分:10)

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

 AutomaticMigrationsEnabled = false;

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

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

Database.SetInitializer<YourDbContext>(null);

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

修改

如果您想确保YourDbContext没有尝试更改数据库,请执行以下操作:

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

再次编辑:

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

  1. 使用DbContext生成器模板生成DbContext和实体 从现有数据库。
  2. 运行enable-migrations
  3. 执行add-migration Initial
  4. 如果一切都完成,第3步应生成空迁移 正常。你可以删除它。
  5. 现在,无论何时进行更改,都需要进行添加迁移 更换名字。除非你这样做,否则这不会进入数据库 更新的数据库。

答案 1 :(得分:3)

将您的上下文的初始化设置为null

应该在应用程序启动时将数据库保留在其现有状态。

请注意,如果在更改dbContext类和/或数据库模式后尝试运行应用程序,则会出现异常,因为数据库模式将不再与上下文所期望的相匹配。

答案 2 :(得分:0)

我在DBFirst和EF 6.1上遇到了这个问题,它正在创建一个基于EntityName的新表。所以我修改了OnModelCreating虚方法来映射我的表。

因此,如果EntityName被命名为MyStuffs,那么默认情况下EnitityNames是多元化的,您可以选择在EF生成期间取消选择。在我的例子中,向导正在生成表格的复数版本。

public class MyContext: DbContext
{
    public MyContext()
        : base("name=MyEntityConnectionName")
    {
    }
    public MyContext(string connectionString)
        : base(connectionString)
    {
    }
    #region methods

    public static MyContext Create()
    {
        return new MyContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        // Map Entities to their tables.
        modelBuilder.Entity<MyModel>().ToTable("MyStuff"); //prevent a new table from being added since we added a mapping
    }

    #endregion
    public virtual DbSet<MyModel> MyEntities{ get; set; }
}