C# 将标识设置为迁移期间先前创建的列

C# 将标识设置为迁移期间先前创建的列,c#,entity-framework,entity-framework-6,ef-code-first,entity-framework-migrations,C#,Entity Framework,Entity Framework 6,Ef Code First,Entity Framework Migrations,我有一个带有CodeFirst数据库(Entity Framework 6)和两个迁移步骤的项目。 在Global.asax中的应用程序_Start中使用以下代码自动更新数据库: Database.SetInitializer( new MigrateDatabaseToLatestVersion<MyDBEntities, MyNamespace.Configuration>()); 第二个迁移步骤是向创建的表添加标识: AlterColumn("dbo.Ga

我有一个带有CodeFirst数据库(Entity Framework 6)和两个迁移步骤的项目。 在Global.asax中的应用程序_Start中使用以下代码自动更新数据库:

Database.SetInitializer(
          new MigrateDatabaseToLatestVersion<MyDBEntities, MyNamespace.Configuration>());
第二个迁移步骤是向创建的表添加标识:

AlterColumn("dbo.GalleryAlbum", "Id", c => c.Int(nullable: false, identity: true));
AlterColumn("dbo.GalleryPics", "Id", c => c.Int(nullable: false, identity: true));
当我运行应用程序时,我可以看到第二个迁移代码正在运行,关于两个迁移的信息被添加到_MigrationHistory表中,但是两个表中的列都没有更改(没有标识)。以下是模式:

[Id]        INT             NOT NULL,
//other columns
第一次迁移的代码优先类如下所示:

 public partial class GalleryAlbum
 {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
 }
 //GalleryPics is the same
这是第二个迁移步骤:

public partial class GalleryAlbum
 {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
 }
 //GalleryPics is the same
您能告诉我,为什么不在这些列中添加标识以及如何修复它吗

谢谢

更新: 生成对数据库的更新请求,这是我从IDbCommandInterceptor获得的:

ALTER TABLE [dbo].[GalleryAlbum] ALTER COLUMN [Id] [int] NOT NULL
ALTER TABLE [dbo].[GalleryPics] ALTER COLUMN [Id] [int] NOT NULL

无法在SQL Server中将列更改为标识,请参阅

请尝试一步添加标识和列:

CreateTable(
         "dbo.GalleryAlbum",
          c => new
          {
              Id = c.Int(nullable: false, identity:true),
              //other columns.....
          }).PrimaryKey(t => t.Id);

ALTER TABLE[Mytable]add constraint[PK_dbo.Mytable]主键(Id)适用于我,如果Id在那里并且根据接受的答案将数据放在适当的位置

,如果您在最初创建表时只需包含标识,那么这将解决问题。但是,如果该表已经存在,并且您可以访问SSMS,那么我发现最简单的方法是:

  • 备份数据库
  • 更改您的类,使其在代码中具有标识
  • 使用Package Manager控制台生成迁移(
    添加迁移[您的迁移名称]
  • 注释掉新生成的迁移中
    Up
    方法中的代码
  • 在下面添加一行新代码,准备接收您将生成的SQL:
    SQL(@”)
  • 进入SSMS,确保设置为在更改表时生成脚本
  • 在SMSS中的表设计器中添加标识
  • 将表更改保存在SSMS中,并复制生成的SQL。(SQL使用数据复制表,删除原始表,然后使用列上设置的标识重新创建原始表,然后复制所有数据,并再次添加所有外键和约束)
  • 将刚才复制的SQL粘贴到上面添加的代码中的语音标记之间
  • 运行迁移
  • 这样,您就可以进行迁移,添加标识,并可以在数据库的其他副本上成功运行


    注意:生成的
    Down
    方法也无法工作,因为它将删除标识。如果需要使用
    Down
    方法,请创建您添加的SQL的副本,并对其进行调整以再次创建不带标识的表。

    是的,它可以工作。我有一个解决上述问题的方法。但是,我想知道为什么以及什么条件会导致这个问题。您不能在SQL Server中将列更改为标识。谢谢。我希望EF6能够重新创建表并解决此类任务。你能把你的评论转换成对我的问题的回答或再次回答吗?我想将其标记为答案。您还可以更改列名并添加新迁移。
    CreateTable(
             "dbo.GalleryAlbum",
              c => new
              {
                  Id = c.Int(nullable: false, identity:true),
                  //other columns.....
              }).PrimaryKey(t => t.Id);