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 { ...
请注意,您应该使用真实上下文声明DbMigrationsConfiguration
和MigrateDatabaseToLatestVersion
,而不是默认的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
。