1

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

所以我添加了一个代码优先迁移,并在包管理器控制台中使用 update-database 命令运行它。这是我写的“向上”方法:

    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,但看起来我错了,因为当我尝试保存时,我现在收到此错误:“无法在表 'Sections' 中插入标识列的显式值”当 IDENTITY_INSERT 设置为 OFF”

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

4

1 回答 1

4

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

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

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

于 2013-03-28T10:53:17.300 回答