实体框架代码优先 - 初始代码迁移不起作用

Posted

技术标签:

【中文标题】实体框架代码优先 - 初始代码迁移不起作用【英文标题】:Entity Framework code first - initial code migration not working 【发布时间】:2015-07-24 16:10:37 【问题描述】:

我正在尝试从代码运行迁移。我创建了我的模型和启用迁移,然后添加了初始迁移,这个初始迁移包含所有创建表等

public partial class Initial : DbMigration
 
     public override void Up()
     
        CreateTable(..........
     

 public override void Down()
    
           DropTable(...........
     

然后我尝试了 Visual Studio 中的 Update-Database 命令,该命令运行良好,创建数据库并运行初始迁移。

然后我从 Sql Studio 中删除数据库。然后我运行调用迁移管理器类的控制台应用程序

// MigrationManager class

    public static bool PerformMigration(string migrationId)
    
        bool success = false;
        try
        
            DbMigrationsConfiguration<MyDbContext> config = new Configuration();
    ....
            DbMigrator migrator = new DbMigrator(config);
            migrator.Configuration.AutomaticMigrationsEnabled = false;
            if (string.IsNullOrEmpty(migrationId))                    
                migrator.Update(); --> fails saying pending migration
            else
                migrator.Update(migrationId);

            success = true;
        
        catch (Exception e)
        
            success = false;
            LastException = e.Message;
        

        return success;
    

Update() 失败并出现以下错误:

无法更新数据库以匹配当前模型,因为存在待处理的更改并且自动迁移已禁用。 将挂起的模型更改写入基于代码的迁移或启用自动迁移。 将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。

//Configuration.cs
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>

    public Configuration()
    
        AutomaticMigrationsEnabled = false;
    

    protected override void Seed(WorkflowConfigurationDbContext context)
    
        SeedData(context);
     
    private void SeedData()...    



public class MyDbContext : DbContext

    public MyDbContext()
                
            

    public DbSet....

    

当我单步执行 Update() 调用时,它进入 Configuration() 构造函数和 MyDbContext() 构造函数,但之后失败,似乎根本没有尝试初始迁移。

【问题讨论】:

【参考方案1】:

确保您的 EF 上下文的构造函数中的数据库初始化策略是正确的,例如:

 public partial class YourContext: DbContext
 
     static YourContext()
     
         Database.SetInitializer<YourContext>(new CreateDatabaseIfNotExists<YourContext>());
     
 

这是在第一次访问数据库时执行的。

编辑:第二个问题可能与安全性有关:执行迁移的用户是否具有所需的权限?

【讨论】:

感谢您的回复,我已经尝试过了,但没有成功:( 编辑了我的答案:安全性如何?【参考方案2】:

发现问题,命名空间不正确。

DbMigrationsConfiguration<MyDbContext> config = new Configuration();
config.MigrationsNamespace = "Correct Namespace";

【讨论】:

以上是关于实体框架代码优先 - 初始代码迁移不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C# - 实体框架代码优先,延迟加载不起作用

TPC 在代码优先迁移中不起作用

启用迁移不起作用

数据库第一实体框架更新模型不起作用:可能是什么原因?

实体框架:部分更新记录不起作用

实体框架 4 函数导入不起作用