Entity framework 如何使用实体框架dbmigration将列更改为标识?

Entity framework 如何使用实体框架dbmigration将列更改为标识?,entity-framework,ef-code-first,entity-framework-migrations,Entity Framework,Ef Code First,Entity Framework Migrations,我使用Entity Framework 5.0和power tools反向设计了一个小型数据库。然后我开始开发一个网站。我遇到了一个问题,因为我忘了将我的一个表上的ID列设置为IDENTITY列 因此,我添加了一个代码优先迁移,并在PackageManager控制台中使用updatedatabase命令运行它。下面是我写的Up方法: public override void Up() { Sql("DELETE FROM dbo.Sections");

我使用Entity Framework 5.0和power tools反向设计了一个小型数据库。然后我开始开发一个网站。我遇到了一个问题,因为我忘了将我的一个表上的ID列设置为IDENTITY列

因此,我添加了一个代码优先迁移,并在PackageManager控制台中使用updatedatabase命令运行它。下面是我写的Up方法:

    public override void Up()
    {
        Sql("DELETE FROM dbo.Sections");
        Sql("DELETE FROM dbo.QuestionInstances");

        DropForeignKey("dbo.SectionInstances", "SectionID", "dbo.Sections");
        DropForeignKey("dbo.QuestionInstances", "SectionID", "dbo.Sections");

        DropTable("dbo.Sections");

        CreateTable(
            "dbo.Sections",
            c => new
            {
                ID = c.Int(nullable: false, identity: true),
                UniqueDescription = c.String(nullable: false, maxLength: 50),
                Heading = c.String(maxLength: 500),
            })
            .PrimaryKey(t => t.ID);

        AddForeignKey("dbo.SectionInstances", "SectionID", "dbo.Sections");
        AddForeignKey("dbo.QuestionInstances", "SectionID", "dbo.Sections");
    }
我检查了数据库,它已被成功更改

我本来希望实体框架更新其模型并停止显式设置ID,但似乎我错了,因为当我尝试保存时,我现在遇到了以下错误:当identity_insert设置为OFF时,无法在表“Sections”中插入identity列的显式值


如何让实体框架认识到该列现在是一个标识列

由于您在Id列尚未设置为IDENTITY时对数据库进行了反向工程,因此已使用DatabaseGenerateOption生成代码优先模型。实体上的Id属性未设置任何值

这会导致EF创建一个Id设置为的insert语句,该语句在将列更改为IDENTITY后不再工作


您必须手动修复该配置,方法是将其设置为DatabaseGenerateOption.Identity,或者干脆将其全部删除,因为这是整数字段的默认值。

因为您在Id列尚未设置为Identity时对数据库进行了反向工程,已使用DatabaseGenerateOption生成代码优先模型。未为实体上的Id属性设置任何

这会导致EF创建一个Id设置为的insert语句,该语句在将列更改为IDENTITY后不再工作


您必须手动修复该配置,方法是将其设置为DatabaseGeneratedOption.Identity,或者干脆将其全部删除,因为这是整数字段的默认值。

您实际使用的是代码优先模型,还是使用的是EDMX文件?我使用的是代码优先。没有EDMX。好的-我猜您已经用DatabaseGenerateOption配置了Id属性。没有。Powertools可能在第一次对数据库进行反向工程时就做到了这一点,因此您必须手动删除它,因为您现在将它作为标识列。@PeterHansen-当然就是这样!我有一个SectionMap.cs类,告诉框架如何映射到数据库……我将其更改为:this.Propertyt=>t.ID.hasDatabaseGenerateOptions DatabaseGenerateOptions.Identity;它确实有DatabaseGeneratedOption.None。请给我一个答案,这样我就可以接受了!你真的有一个代码优先的模型吗,或者你正在使用一个EDMX文件?我正在使用代码优先。没有EDMX。好的-我猜您已经用DatabaseGenerateOption配置了Id属性。没有。Powertools可能在第一次对数据库进行反向工程时就做到了这一点,因此您必须手动删除它,因为您现在将它作为标识列。@PeterHansen-当然就是这样!我有一个SectionMap.cs类,告诉框架如何映射到数据库……我将其更改为:this.Propertyt=>t.ID.hasDatabaseGenerateOptions DatabaseGenerateOptions.Identity;它确实有DatabaseGeneratedOption.None。请给我一个答案,这样我就可以接受了!顺便说一句,当我更改Map类以匹配我手动创建的数据库迁移时,框架将其作为对模型的更改。所以我运行了添加迁移。它用以下代码创建了一个Up方法:AlterColumndbo.Sections,ID,c=>c.Intnullable:false,identity:true;update database-verbose显示这将生成sql ALTER TABLE[dbo].[Sections]ALTER COLUMN[ID][int]NOTNULL-这实际上不会更改任何内容。正确的方法是1。更改映射文件2。调用addmigration3。将生成的迁移代码更改为删除并重新创建表是的,当然可以。通常的工作流程是更改代码优先模型,通过调用add migration将更改作为迁移的支架,然后通过调用update database更新数据库。迁移功能不会知道您手动更改了数据库,因此它也会创建一个迁移。您可以调用addmigrationname–IgnoreChanges。这将创建一个忽略model.BTW更改的空迁移。当我更改Map类以匹配我手动创建的数据库迁移时,框架将其作为对模型的更改。所以我运行了添加迁移。它用以下代码创建了一个Up方法:AlterColumndbo.Sections,ID,c=>c.Intnullable:false,identity:true;update database-verbose显示这将生成sql ALTER TABLE[dbo].[Sections]ALTER COLUMN[ID][int]NOTNULL-这实际上不会更改任何内容。正确的方法是1。更改映射文件2。调用addmigration3。将生成的迁移代码更改为删除并重新创建表是的,当然可以。T 通常的工作流程是更改代码优先模型,通过调用add migration来构建迁移,然后通过调用update database来更新数据库。迁移功能不会知道您手动更改了数据库,因此它也会创建一个迁移。您可以调用addmigrationname–IgnoreChanges。这将创建一个忽略模型更改的空迁移。