我正在学习实体框架(目前正在使用EF6 beta),而我正在使用现有数据库上的代码优先模式。实体和 DbContext
使用T4模板自动创建类。
我想阻止 DbContext
从运行时创建/更改任何内容到数据库。
我怎样才能做到这一点?
我正在学习实体框架(目前正在使用EF6 beta),而我正在使用现有数据库上的代码优先模式。实体和 DbContext
使用T4模板自动创建类。
我想阻止 DbContext
从运行时创建/更改任何内容到数据库。
我怎样才能做到这一点?
当你这样做 启用的迁移 命令,您将看到文件夹 /迁移 在其下可以找到名为的文件 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.");
}
再次编辑:
我试图了解你想要完成的场景。如果您有现有数据库,并且只想手动更新它,则这是方法:
将上下文的初始化设置为 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; }
}