c# - 如何正确保留标识值以供在数据库中使用?

标签 c# sql identity ado.net-entity-data-model

我们有一些代码需要在 SQL 中维护我们自己的标识 (PK) 列。我们有一个表,我们在其中批量插入数据,但是我们在批量插入完成之前将数据添加到相关表中,因此我们无法使用 IDENTITY 列并预先找出值。

当前代码正在选择字段的 MAX 值并将其递增 1。虽然我们的应用程序的两个实例同时运行的可能性很小,但它仍然不是线程安全的(不是提到它每次都会进入数据库)。

我正在使用 ADO.net 实体模型。我将如何“保留”要使用的 id 范围,当该范围用完时,抓取一个新 block 来使用,并保证不会使用相同的范围。

最佳答案

  • 使用更通用的唯一标识符数据类型,如 UNIQUEIDENTIFIER (UUID) 而不是 INTEGER。在这种情况下,您基本上可以在客户端创建它,将它传递给 SQL 而不必担心。当然,缺点是该字段的大小。
  • 在数据库中创建一个简单的表CREATE TABLE ID_GEN (ID INTEGER IDENTITY),并将其用作工厂来为您提供标识符。理想情况下,您将创建一个存储过程(或函数),您将向其传递所需数量的标识符。然后,存储过程会将此行数(空)插入到此 ID_GEN 表中,并将返回所有新的 ID,您可以在代码中使用这些行。显然,您的原始表将不再具有 IDENTITY
  • 创建您自己的上述 ID_Factory 变体。

如果您没有其他限制,我会选择简单性 (UUID)。

关于c# - 如何正确保留标识值以供在数据库中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3056646/

相关文章:

sql - 数据库ID最佳做法

c# - ASP.NET _ViewStart.cshtml - 获取请求

php - mySQL - 在一个查询中使用两个 JOIN?

SQL 查询 ORDER BY 两个条件无法正常工作 - 我做错了什么?

c# - 如何使用 Core 2.2 中的身份在浏览器关闭 15 分钟后保持 session 事件?

sql-server - 如何在 SQL Server 中重置增量标识的起始值

c# - ConfigurationManager.AppSettings 在单元测试项目中返回 Null

c# - 如何从 DelegatingHandler 中安全地抛出异常

c# - 覆盖获取,但不设置

php - 如何获取For循环中结果的总COUNT