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

时间:2013-03-28 09:54:02

标签: entity-framework ef-code-first ef-migrations

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

所以我添加了代码首次迁移,并使用包管理器控制台中的update-database命令运行它。这是我写的“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时的“部分”“

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

1 个答案:

答案 0 :(得分:4)

由于您在Id列尚未设置为IDENTITY时对数据库进行了反向工程,因此已生成代码优先模型,并为实体上的Id属性设置了DatabaseGeneratedOption.None

这会导致EF创建一个带有Id集的插入语句,在将列更改为IDENTITY后不再有效。

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

相关问题