2013-02-21 58 views
1

this thread中的答案对我无效。EF 5将不会将IsIdentity的PK属性设置为false

我把这个注释放在我的客户类中的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中的表。客户标识列仍具有标识规范是和是标识是。我究竟做错了什么?

谢谢。

回答

2

你没有做错什么。这是迁移的一个限制(或者可能被认为是bug),因为SQL Server不允许在现有列上更改IDENTITY。它只能在新列上设置。如果您在management studio中更改身份值,它将在内部执行一些涉及临时表和大量数据操作的复杂SQL批处理。

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

1

EF将Id字段视为PK,并且PK必须具有唯一值。 Identity Specification的含义。 Table Column Properties

设置DatabaseGeneratedOption.None只指定Id不会由数据库引擎生成,您将不得不提供它(我认为这不是一个好主意)。

+0

为什么它不是一个好主意?我已经绘制了旧数据的映射图,大约有5万个客户(公司最近50年)。但是,Ids范围从0-999999。有巨大的差距。我不希望让数据库自动生成B/C,然后当有950,000个可用的6位数ID时,我将进入7位数的客户ID。因此,我从0开始,找到下一个可用的Id,分配它并插入新记录。合理? – BBauer42 2013-02-21 15:25:30

相关问题