我使用迁移(EF 5.0)和代码优先(code-first)有一个有趣的效果:
我用 GUID 主键创建了一些模型。(顺便说一句: 对我来说很重要的是,SQLServer 使用 NEWSEQUENTIALID()
,这似乎是当前版本的默认值)
在某个时候,我激活了迁移。我在最初的迁移中添加了一些代码,这主要是根据需要的 .Index()
。
当我删除数据库并调用 update-database 时,会得到以下错误:
无法更新数据库以匹配当前模型,因为 暂停更改并禁用自动迁移 将挂起的模型更改为基于代码的迁移或启用 自动迁移,设定 启用为 true 以启用 自动迁移。可以使用“添加-迁移”命令编写 将挂起的模型更改为基于代码的迁移。
我尝试了 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)
{
// ...
}
}
下面是添加迁移创建的代码: 它似乎没有做任何新的事情-也许我遗漏了什么?
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));
}
}
所以我很好奇: 我做了什么让迁徙迷失了方向?我要怎么做才能让它只用一次初始迁移就能正常工作呢?
解决方案 : 下面的解决方案为我解决了这个问题: