【问题标题】:EF Database Generated key reach the maximum valueEF 数据库生成的密钥达到最大值
【发布时间】:2014-11-04 22:20:06
【问题描述】:

您知道,通过使用波纹管属性,我们可以为每个条目自动生成int 的身份,以防添加新条目

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

如果您曾经关注过,数据库会为每个新条目生成唯一的int 编号,也会自动递增,如果删除,它将从最新的专用编号继续(可能会被删除),不是来自表中最新使用的数字。这导致表中没有后续数字,如下所示:

Id  Value GroupId
1   A       1
2   B       1
8   C       2//here we have 5 entry deletion
9   D       2
25  E       3//here we have 15 entry deletion

我的问题是:假设我们有大量的条目要注册。如果 key 属性,比如Id 达到其类型的最大数量(这里int 容量等于 2^32),EF 或 SQL 服务器是否会识别出我们有很多未使用的数字作为表中的 key使用它们?还是不行?

【问题讨论】:

    标签: c# entity-framework ef-code-first database-management


    【解决方案1】:

    IDENTITY 也适用于 BIGINT 列,但很难达到最大值。只需将 .NET 代码中的 Int32 替换为 Int64 并将数据库中的 INT 替换为 BIGINT 即可。不要重新设定值,因为它们将从 1 开始,并且会有重复。

    【讨论】:

    • 而且重复也会导致数据库异常。所以没有使用未使用号码的政策吗?你就在 > 很难达到最大值。无论如何假设这里有大量的条目。
    【解决方案2】:

    我不知道 EF 会这样做(如果这样做我会担心)。标准的事情是拥有一个 DBA 种子。像这样的。

    DBCC CHECKIDENT('Table', RESEED, 0)
    

    【讨论】:

    • EF 不这样做。这是 SQL Server 中 auto inc 字段的行为。
    • 自动增量属性本身就是一种很好的行为。但是当它达到最大值时,它对下一个条目做了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2016-03-08
    • 2021-05-13
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多