【发布时间】:2013-03-28 09:54:02
【问题描述】:
我使用 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 时的 'Sections'"
如何让实体框架识别该列现在是标识列?
【问题讨论】:
-
您真的有代码优先模型,还是使用 EDMX 文件?
-
我使用的是代码优先。没有 EDMX。
-
好的 - 我猜你在某处配置了
DatabaseGeneratedOption.None的 Id 属性。 Powertools 可能在第一次对数据库进行逆向工程时就这样做了,因此您必须手动删除它,因为您现在将它作为标识列。 -
@PeterHansen - 当然就是这样!我有一个 SectionMap.cs 类,它告诉框架如何映射到数据库....我已将其更改为:“ this.Property(t => t.ID) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);” (它确实有 DatabaseGeneratedOption.None)。请提出答案,以便我接受!
标签: entity-framework ef-code-first entity-framework-migrations