我正在尝试从代码运行迁移。我创建了我的模型并启用了迁移,然后添加了初始迁移,这个初始迁移包含所有创建表等
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() 构造函数,但之后失败了,它似乎根本没有尝试初始迁移。
最佳答案
确保 EF 上下文构造函数中的数据库初始化策略是正确的,例如:
public partial class YourContext: DbContext
{
static YourContext()
{
Database.SetInitializer<YourContext>(new CreateDatabaseIfNotExists<YourContext>());
}
}
这是第一次访问数据库时执行。
编辑:第二个问题可能与安全性有关:执行迁移的用户是否具有所需的权限?
关于c# - Entity Framework 代码优先 - 初始代码迁移不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30213692/