【问题标题】:Should I use an int or a long for the primary key in an entity framework model我应该在实体框架模型中使用 int 还是 long 作为主键
【发布时间】:2014-09-11 12:09:58
【问题描述】:

我正在编写一个 MVC5 Internet 应用程序,我对模型的 id 字段有疑问。

我应该在模型中使用 int 还是 long 作为 id?我说的是用于主键的字段?如果数据库有 100,000 条记录,int 就足够了吗? c# 中的 int 与 SQL 数据库中的 int 有区别吗?

提前致谢

【问题讨论】:

  • 请注意,如果您的 Code First 类的主键属性是long 类型,您可能需要在属性中添加[Key] DataAnnotation

标签: c# model int primary-key entity-framework-6


【解决方案1】:

对于 INT 类型,从 1 开始,您可以获得超过 20 亿 行可能的行 - 这对于绝大多数情况来说应该绰绰有余。使用BIGINT,您得到大约 922 万亿(922 有 15 个零 - 922'0000 亿) - 对你来说足够了吗??

如果您使用从 1 开始的 INT IDENTITY,并且您每秒插入一行,那么全天候,您需要 66.5 才能达到 20 亿限制....

如果您使用从 1 开始的BIGINT IDENTITY(T-SQL 中的BIGINT 定义为long 或.NET 语言中的Int64),并且您插入每秒一千行,你需要一个令人难以置信的 2.92 亿年,才能达到 922 万亿的极限......

MSDN Books Online 中阅读有关它的更多信息(包括所有选项)。

【讨论】:

  • 为每个 SQL 服务意外关闭/失败的计数器添加 1000,因为服务器将 1000 个数字提前保存在缓存中,并且不会将它们重新置于失败状态,因此您可以轻松地看到 1000 的跳跃您的身份列。我很容易在我定义的每个身份列中选择“长”(Int64)版本。如果您不知道这种行为:stackoverflow.com/a/14162761/665783
【解决方案2】:

两者都可以。这取决于表中有多少条记录。 Int 每个表只允许 2*10^9 条记录。

如果您确定 2*10^9 就足够了,请使用 int 作为键。

但是: 如果记录数超过 2*10^9 的可能性很小,请使用 long。 如果您不知道您将拥有多少条记录,请使用 long。

【讨论】:

  • 大小不是2*10^9,是2^31
  • @Erik Funkenbusch:2^10 = 1024 大约是 10^3。 2^31 = 2*2^9。因此它大约是 2*(10^3)​​^3 = 2*10^9
【解决方案3】:

C# 和 SQL 对 int 的定义相同,这是一个从 -2^312^31 - 1 的整数数据类型(如果您愿意,可以选择 2,147,483,647)。

如您所见,int 中的 100,000 条记录可以容纳超过 20,000 次,所以是的,您在当前情况下会没事的。

但是,long 会在 sql 中转换为 bigint(本身没有“长”),并且值上限为 2^63 - 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多