【发布时间】:2014-01-24 22:51:00
【问题描述】:
我使用迁移(EF 5.0)和代码优先有一个有趣的效果:
我创建了一些带有 GUID 主键的模型。 (顺便说一句:SQL Server 使用NEWSEQUENTIALID() 对我来说很重要,这似乎是当前版本中的默认值)
在某些时候,我激活了迁移。我在初始迁移中添加了一些代码,这主要是 .Index() 根据需要。
当我删除数据库并调用 update-database 时,出现以下错误:
无法更新数据库以匹配当前模型,因为存在 正在等待更改,并且自动迁移已禁用。要么写 待定模型更改为基于代码的迁移或启用 自动迁移。放 DbMigrationsConfiguration.AutomaticMigrationsEnabled 为 true 以启用 自动迁移。您可以使用 Add-Migration 命令编写 待定模型更改为基于代码的迁移。
我试过AutomaticMigrationsEnabled = true,它在没有改变或添加任何东西的情况下工作!
但由于我不想要AutomaticMigrationsEnabled,我也尝试再次删除数据库,称为update-database,然后是add-migration。我最终得到了一个似乎没有改变任何东西的额外迁移(见下文)。我还尝试将这些行添加到初始迁移的底部 - 但这不会改变任何内容。
其中一个模型:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
初始迁移代码:
public partial class InitialCreate : DbMigration
{
public override void Up()
{
// [...]
CreateTable(
"dbo.Speaker",
c => new
{
Id = c.Guid(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 50),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, true, false); // added manually: unique Name
// [...]
}
}
internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyProject.Repositories.DBContext context)
{
// ...
}
}
下面是 add-migration 创建的代码:它似乎没有做任何新的事情 - 也许我遗漏了什么?
public partial class UnneccessaryMigration : DbMigration
{
public override void Up()
{
// isn't this the exact same code from InitialMigrations?
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
// ...
}
public override void Down()
{
//...
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
}
}
所以我很好奇:我做了什么让迁移迷失方向?我可以做些什么来让它只使用一次初始迁移?
解决方案:以下解决方法对我有用:
- 我删除了数据库和所有迁移,如下所述: https://stackoverflow.com/a/11679386/3168401
- 已执行 Enable-Migrations + Add-Migration Initial
- 将我手工制作的 .Index() 更改合并到文件中。 现在 Update-Database 再次工作 - 在删除数据库时也会重复工作。
【问题讨论】:
标签: c# entity-framework entity-framework-migrations