Fre*_*red 13 c# entity-framework ef-code-first ef-migrations
我首先使用Entity Framework代码,并通过以下代码设置AutomaticMigrationsEnabled为true:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<DbContext, MigrateDBConfiguration>());
//////////////////////////////////
public class MigrateDBConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration<DbContext>
{
public MigrateDBConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
在第一次运行项目时,它工作正常,并创建数据库和表.在我更改模型并删除一些字段或添加新字段并运行Add-Migration之后,生成了迁移类但在运行项目之后发生此异常:
EntityFramework.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理
附加信息:自创建数据库以来,支持"DBContext"上下文的模型已更改.
编辑:像arturo menchaca的回答我改变可能代码如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<DBContext, MigrateDBConfiguration<DBContext>>());
...
Run Code Online (Sandbox Code Playgroud)
但例外情况是:
数据库中已经有一个名为"MyTable"的对象.
我想申请迁移.
Art*_*aca 16
自动迁移意味着您无需为add-migration模型中的更改运行命令,但必须update-database手动运行命令.
如果自动迁移,当你调用启用update-database,如果在你的模型挂起的更改,一个"自动"的迁移将被添加和数据库将被更新.
如果您希望更新数据库而无需调用update-database命令,则可以Database.SetInitializer(...)在OnModelCreating()上下文中添加方法,如下所示:
public class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, MigrateDBConfiguration>());
}
...
}
public class MigrateDBConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration<MyContext>
{
...
Run Code Online (Sandbox Code Playgroud)
请注意,您应该声明DbMigrationsConfiguration并MigrateDatabaseToLatestVersion使用您的真实上下文,而不是默认值DbContext.
Fre*_*red 15
最后我找到了解决问题的方法.我在每个应用程序启动时调用此方法:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的实体发生更改,则需要先运行add-migration以创建迁移脚本。
之后在你的 Global.asax
你需要有一些这样的代码
var configuration = new MyProject.Configuration();
var migrator = new System.Data.Entity.Migrations.DbMigrator(configuration);
migrator.Update();
Run Code Online (Sandbox Code Playgroud)
每次运行 asp.net 项目时,它都会检查是否有新的迁移要运行并update-database自动运行。