实体框架,自动应用迁移

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)

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

  • 这实际上不是真的.通过使用MigrateToTheLatestMigrationVersion数据库初始化器,这应该工作(它在过去对我有用).我现在实际上遇到了同样的问题.我不知道我改变了什么,但我知道这个设置在过去有效. (3认同)

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)

  • 这非常感谢!我稍微改进了这一点,只需使用`migrator.Update();`而不是让脚本输出并直接执行 (2认同)

gor*_*ums 6

如果您的实体发生更改,则需要先运行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自动运行。