12

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

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

我怎样才能做到这一点?

4

3 回答 3

12

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

 AutomaticMigrationsEnabled = false;

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

但是,如果您的数据库比您的域模型大,即您只是在已经存在的数据库的一部分上进行操作,那么在您的应用程序启动的某个位置(如果它是 ASP.NET 应用程序,Application_Start事件处理程序),您需要添加以下代码:

Database.SetInitializer<YourDbContext>(null);

否则,Entity Framework 将抱怨您的域模型中的数据库定义与数据库的实际当前状态不匹配。

编辑:

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

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

再次编辑:

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

  1. 使用 DbContext 生成器模板从现有数据库生成 DbContext 和实体。
  2. 运行启用迁移
  3. 做添加迁移初始
  4. 如果一切都正确完成,第 3 步应该会生成空迁移。你可以删除它。
  5. 现在,每当您进行一些更改时,您都需要执行 add-migration ChangeName。这不会进入数据库,除非您执行更新数据库。
于 2013-09-18T04:24:48.233 回答
3

将上下文的初始化程序设置为null.

当应用程序启动时,这应该使数据库处于现有状态。

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

于 2013-09-18T04:07:03.273 回答
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; }
}
于 2014-11-01T01:04:30.237 回答