我使用迁移(EF 5.0)和代码优先的方式产生了有趣的效果:
我使用GUID主键创建了一些模型。(顺便说一句:对我来说,SQL Server使用NEWSEQUENTIALID()
,这很重要,这似乎是当前版本中的默认值)
在某个时候,我激活了迁移。我在初始迁移中添加了一些代码,主要是.Index()
根据需要。
当我删除数据库并调用更新数据库时,出现以下错误:
无法更新数据库以匹配当前模型,因为有未决的更改并且自动迁移被禁用。将挂起的模型更改写到基于代码的迁移中,或者启用自动迁移。将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
- 已执行的使能迁移+添加迁移初始
- 将我手工制作的.Index()更改合并到文件中。现在,更新数据库可以再次工作-删除数据库时也可以重复进行。