C# 在实体框架中使用更新的DatabaseGenerateOption迁移实体

C# 在实体框架中使用更新的DatabaseGenerateOption迁移实体,c#,entity-framework,entity-framework-migrations,C#,Entity Framework,Entity Framework Migrations,我已经根据本文创建了CodeFirst应用程序-。现在我要更改Blog.BlogId的DatabaseGenerated选项。我用下一种方法更改了代码: public class Blog { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int BlogId { get;set; } ... } 并为此代码更新创建了迁移: public overri

我已经根据本文创建了CodeFirst应用程序-。现在我要更改
Blog.BlogId
的DatabaseGenerated选项。我用下一种方法更改了代码:

public class Blog
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int BlogId
    {
        get;set;
    }
    ...
}
并为此代码更新创建了迁移:

public override void Up()
{
    DropForeignKey("dbo.Posts", "BlogId", "dbo.Blogs");
    DropPrimaryKey("dbo.Blogs");
    AlterColumn("dbo.Blogs", "BlogId", c => c.Int(nullable: false, identity: false));
    AddPrimaryKey("dbo.Blogs", "BlogId");
    AddForeignKey("dbo.Posts", "BlogId", "dbo.Blogs", "BlogId", cascadeDelete: true);
}
根据这一点,我修改了在Main函数中创建blog实体的代码(在那里添加了
BlogId

现在,当我尝试运行我的代码时,我遇到了下一个异常:DbUpdateException带有下一条消息-当identity\u insert设置为OFF时,无法在表“Blogs”中为identity列插入显式值

另一方面,当我删除所有迁移并从更新的实体创建初始迁移,并创建没有标识标志的db(不要尝试更新exist db)时,使用my
BlogId创建实体的代码可以工作


我的问题是,在实际的项目中,我已经创建了一个表,我不想重新创建整个表,只想更新键列。如何使用实体框架迁移?

您正在尝试从列中删除标识属性,不幸的是,这通常不是一件小事(至少对于SQL Server来说,我认为这是不可能的)

有关说明,请参见:

  • EF将其放入迁移中:

    AlterColumn("dbo.Events", "EventID", c => c.Int(nullable: false, identity: false))
    
    生成的sql如下所示:

    ALTER TABLE [dbo].[Events] ALTER COLUMN [EventID] [int] NOT NULL`
    
    事实上,迪迪蹲着


最后几个链接还提供了一些想法,说明如何自定义迁移以删除标识列并保留数据。例如,从最后一个链接:

更改SQL Server中列的标识设置的步骤包括:

  • 删除所有指向要更改的主键的外键约束
  • 删除主键约束
  • 重命名现有列(以便我们以后可以重新创建外键关系)
  • 使用新的标识设置添加新的主键列
  • 更新现有数据,以便保留以前的外键关系
  • 如果新列是标识列,则需要使用新值更新所有外键列
  • 如果新列未启用标识,则可以从上一个标识列复制旧值
  • 删除旧主键列
  • 添加主键约束
  • 添加回外键约束

  • 如果您尝试使用SSMS执行此操作,它将创建一个新表,并将所有数据复制到新表中。谢谢,它可以正常工作。我去掉了AlterColumn(..),用AddColumn(tempColumn)替换它,运行SQL(update),DropColumn(oldColumn),最后重命名Column(tempColumnToOld)
    ALTER TABLE [dbo].[Events] ALTER COLUMN [EventID] [int] NOT NULL`