entity framework代码优先:迁移失败与更新数据库,强制不必要的(?)添加迁移

我有一个有趣的效果使用迁移(EF 5.0)和代码优先:

我创build了一些带有GUID主键的模型。 (顺便说一句:对我来说,SQL Server使用NEWSEQUENTIALID() ,这似乎是当前版本的默认值)

在某个时候,我激活了迁移。 我添加了一些代码到最初的迁移,这是大多数.Index()根据需要。

当我删除数据库并调用update-database时,出现以下错误:

无法更新数据库以匹配当前模型,因为有未决的更改,并且禁用了自动迁移。 将挂起的模型更改写入基于代码的迁移或启用自动迁移。 将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为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) { // ... } } 

下面是由add-migration创build的代码:它似乎没有做任何新的事情 – 也许我错过了什么?

 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)); } } 

所以我很好奇:我做了什么迷失方向的移民? 我能做些什么来使它只用一次初始迁移?

解决scheme :下面的解决方法为我做了:1.我删除了数据库和所有的迁移,如下所述: https ://stackoverflow.com/a/11679386/3168401 2.执行启用迁移+添加迁移初始化3.合并我的手工制作.Index()更改为文件。 现在,更新数据库再次工作 – 也反复,当删除数据库。

我也尝试再次删除数据库,称为更新数据库,然后添加迁移。 我结束了一个额外的迁移,似乎不会改变任何东西(见下文)

基于以上的细节,我认为你先做了最后一件事。 如果在“ Add-migration之前运行“ Update database ,它将不会使用迁移模式更新数据库。 首先,您需要添加迁移,然后运行update命令。

使用包pipe理器控制台按照这个顺序尝试它们。

 PM> Enable-migrations //You don't need this as you have already done it PM> Add-migration Give_it_a_name PM> Update-database 

entity framework确实在身份字段周围存在一些问题。

您不能在现有的表上添加GUID标识

迁移:不检测对DatabaseGeneratedOption的更改

逆向工程不会将缺省的NEWSEQUENTIALID()的GUID键标记为存储生成的标识

这些都不能完全描述你的问题,你额外的迁移中的Down()方法是有趣的,因为它似乎试图从初始迁移中的CREATE TABLE设置它时尝试从列中删除IDENTITY!

此外,如果使用Update-Database -ScriptUpdate-Database -Verbose查看从这些AlterColumn方法运行的SQL,则会看到SQL在UpDown是相同的,而实际上什么都不做。 IDENTITY保持不变(对于当前版本 – EF 6.0.2及以下版本) – 如我链接到的前两个问题所述。

我认为你应该删除额外的迁移中的冗余代码,并且现在就进行空迁移。 你可以订阅/投票处理的问题。

参考文献:

更改IDENTITY选项diddly蹲

使用自定义迁移操作打开/closures身份