1

该线程中的答案对我不起作用。

我把这个注释放在我的客户类的 PK 上,就像这样。

public class Customer
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
}

数据库迁移为新添加的数据注释创建了一个显示这一行的配置:

AlterColumn("dbo.Customers", "Id", c => c.Int(nullable: false));

我运行迁移并查看 SQL Server Management Studio 中的表。客户 ID 列仍然有 Identity Specification Yes 和 Is Identity Yes。我究竟做错了什么?

谢谢。

4

2 回答 2

2

你没有做错任何事。这是迁移的限制(或者可能被视为错误),因为 SQL 服务器不允许更改现有列的 IDENTITY。它只能在新列上设置。如果您在 management studio 中更改标识值,它将在内部执行一些复杂的 SQL 批处理,涉及临时表和大量数据操作。

最简单的解决方案是删除数据库并从初始迁移中删除身份定义。否则,使用 SQL 探查器查看 SQL 管理工作室在更改列的标识值时正在做什么,并在迁移中使用该 SQL 而不是AlterColumn.

于 2013-02-21T18:36:45.243 回答
1

EF把Id字段当作一个PK,一个PK必须有唯一值。这就是身份规范的含义。表列属性

设置 DatabaseGeneratedOption.None 仅指定 Id 不会由 DB Engine 生成,您必须提供它(我认为这不是一个好主意)。

于 2013-02-21T14:48:42.620 回答