我正在学习实体框架(目前使用 EF6 beta),并且我在现有数据库上使用代码优先模式。实体和DbContext
类是使用 T4 模板自动创建的。
我想防止DbContext
在运行时在数据库中创建/更改任何内容。
我怎样才能做到这一点?
我正在学习实体框架(目前使用 EF6 beta),并且我在现有数据库上使用代码优先模式。实体和DbContext
类是使用 T4 模板自动创建的。
我想防止DbContext
在运行时在数据库中创建/更改任何内容。
我怎样才能做到这一点?
当您执行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.");
}
再次编辑:
我试图了解您要完成的场景。如果您有现有的数据库,并且您想手动更新它,这是一种方法:
将上下文的初始化程序设置为null
.
当应用程序启动时,这应该使数据库处于现有状态。
请注意,如果您在更改 dbContext 类和/或数据库模式后尝试运行应用程序,则会出现异常,因为您的数据库模式将不再符合上下文的预期。
我在 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; }
}