entity framework,自动应用迁移

我首先使用Entity Framework代码,并通过以下代码设置AutomaticMigrationsEnabled为true:

Database.SetInitializer(new MigrateDatabaseToLatestVersion()); ////////////////////////////////// public class MigrateDBConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration { public MigrateDBConfiguration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; } } 

在第一次运行项目时,它可以正常工作并创建数据库和表。 在我更改模型并删除一些字段或添加新字段并运行Add-Migration之后,生成了迁移类但在运行项目之后发生此exception:

EntityFramework.dll中出现“System.InvalidOperationException”类型的exception,但未在用户代码中处理

附加信息:自创建数据库以来,支持“DBContext”上下文的模型已更改。

编辑:像arturo menchaca的回答我改变可能代码如下:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer(new MigrateDatabaseToLatestVersion<DBContext, MigrateDBConfiguration>()); ... 

但例外情况是:

数据库中已经有一个名为“MyTable”的对象。

我想申请迁移。

自动迁移意味着您不需要为模型中的更改运行add-migration命令,但必须手动运行update-database命令。

如果在调用update-database时启用了“自动迁移”,则如果模型中存在待定更改,则将添加“自动”迁移并更新数据库。

如果您希望更新数据库而无需调用update-database命令,则可以在上下文中的OnModelCreating()方法中添加Database.SetInitializer(...) ,如下所示:

 public class MyContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer(new MigrateDatabaseToLatestVersion()); } ... } public class MigrateDBConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration { ... 

请注意,您应该使用真实上下文声明DbMigrationsConfigurationMigrateDatabaseToLatestVersion ,而不是默认的DbContext

最后我找到了解决问题的方法。 我在每个应用程序启动时调用此方法:

 public void InitializeDatabase(DataAccessManager context) { if (!context.Database.Exists() || !context.Database.CompatibleWithModel(false)) { var configuration = new DbMigrationsConfiguration(); var migrator = new DbMigrator(configuration); migrator.Configuration.TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString, "System.Data.SqlClient"); var migrations = migrator.GetPendingMigrations(); if (migrations.Any()) { var scriptor = new MigratorScriptingDecorator(migrator); var script = scriptor.ScriptUpdate(null, migrations.Last()); if (!string.IsNullOrEmpty(script)) { context.Database.ExecuteSqlCommand(script); } } } } 

如果您的实体发生了变化,则需要先运行add-migration来创建迁移脚本。

之后在你的Global.asax

你需要有这样的代码

  var configuration = new MyProject.Configuration(); var migrator = new System.Data.Entity.Migrations.DbMigrator(configuration); migrator.Update(); 

每次运行asp.net项目时,它都会检查您是否有新的迁移运行并自动为您运行update-database