在实体框架和 Sql Server 中创建对象计数器

2024-03-28

注 1:我重新表述了问题。它现在由供应商和订单组成,而不是汽车和零件。

注 2:此问题是假设的。 我的目标是了解如何创建对象计数器。

为了满足监管要求,我需要对每个供应商的每个订单进行顺序编号。

我在用着‘实体框架’与 SQL Server。

In my 假想例如,我有一个Supplier类和一个Order class.

每个供应商都有Orders。每个订单都有一个产品和数量。意思是,它说明了从供应商处订购了哪些产品以及数量。

我需要能够创建计数器(例如自动递增的数字)来计算订单对于每个供应商.

出于监管原因,每个供应商必须按照创建顺序对其订单进行顺序编号,并且仅使用整数。

当我们检查一个Order,我们应该知道由其OrderCountForSupplier列,其创建顺序是什么(aDateTime / TimeStamp监管机构的专栏不够充分。他们需要这样的计数器)。

为了简单起见,订单无法删除(其状态可以更改,但无法删除)。

对我来说,拥有一个包括技术/编程方式而不仅仅是理论方式的解决方案非常重要。

我制作了一个图表,以便以最清晰的方式解释我的问题:


我有一个可能有效的方法,并且很高兴听到反馈。

我正在考虑一个/多个外部表来保存柜台。就像是:

Supplier Order Counters Table

| SupplierId | OrderCountForSupplier
------------------------
| 54654         | 3
| 78787         | 2
| 99666         | 4

我需要一个触发器来增加OrderCountForSupplier每个供应商的每次插入计数器?

如果不是——这个增量如何完成一个安全的方法? (例如,两个进程处于竞争状态以获取下一个计数器并递增它,这最终可能导致重复的订单计数)。

还有一个注意事项:这可以吗Entity Framework明智的?如果不是 - 一个Sql Server解决方案将受到尊重。


第一个答案,问题里的例子写完后就变了。

您说零件 I​​D 中存在间隙是否可以,因为“某些零件可能会在此过程中被删除”。

那么,你的例子有什么区别:

Car      PartID
54654    1
54654    2
54654    3
78787    1
78787    2
99666    1
99666    2
99666    5
99666    7

还有这个变体:

Car      PartID
54654    1
54654    2
54654    3
78787    4
78787    5
99666    6
99666    7
99666    8
99666    9

在第二个变体中,每个部件都有一些对于每辆车来说都是唯一的 ID(它也是全球唯一的,但这并不重要)。在第二个变体中PartID指定将部件插入表中的顺序,与第一个变体中相同。

所以,我会用一个简单的IDENTITY column:

Parts

PartID int IDENTITY NOT NULL (PRIMARY KEY)
CarLicenseNum int NOT NULL (FOREIGN KEY)
PartName varchar(255)

供应商订单示例更新

更新的问题中最重要的一点是“监管原因”。它回答了为什么你想做这种不自然的事情的问题。 “监管”和效率往往是对立的。

本质上,这意味着你必须使用可序列化事务隔离级别 https://msdn.microsoft.com/en-AU/library/ms173763.aspx插入新行并计算序列中的下一个数字时。它会损害并发/吞吐量,但会保证多用户环境中的一致性和“安全”。

我不知道如何在实体框架中做到这一点,它应该是可能的。但是,同样,出于“监管原因”,我会将这个逻辑放入数据库的存储过程中,并确保普通用户没有对数据库的写访问权限。Orders直接表,但仅有权执行此专用存储过程。您可以在 EF 代码中复制此存储过程的逻辑,但数据库本身将开放通过其他应用程序完成的更改,这可能不符合法规要求。

您可以使用单独的表来实现它,该表存储每个供应商的最新序列号,或者您可以即时读取最后一个最大序列号。如果每个供应商只有很少的订单,那么这个包含最新计数器值的单独表将相当于Orders表,你不会得到太多。无论如何,拥有一个合适的索引是关键。获取最新的计数器值将是索引中的一项搜索。

这是不使用额外表的存储过程的示例。

确保Orders表有唯一索引(SupplierId, OrderCountForSupplier)。事实上,即使您使用额外的表来强制执行约束,也必须拥有此索引。

CREATE PROCEDURE [dbo].[AddOrder]
    @ParamSupplierID int, 
    @ParamProductSerial varchar(10),
    @ParamQuantity int,
    @NewOrderID int OUTPUT
AS
BEGIN
    SET NOCOUNT ON; 
    SET XACT_ABORT ON;

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

    BEGIN TRANSACTION;
    BEGIN TRY

        DECLARE @VarMaxCounter int;

        SELECT TOP(1) @VarMaxCounter = OrderCountForSupplier
        FROM dbo.Orders
        WHERE SupplierID = @ParamSupplierID
        ORDER BY OrderCountForSupplier DESC;

        SET @VarMaxCounter = ISNULL(@VarMaxCounter, 0) + 1;

        INSERT INTO dbo.Orders
            (SupplierID
            ,OrderCountForSupplier
            ,ProductSerial
            ,Quantity)
        VALUES
            (@ParamSupplierID
            ,@VarMaxCounter
            ,@ParamProductSerial
            ,@ParamQuantity);

        SET @NewOrderID = SCOPE_IDENTITY();

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        -- TODO: handle the error
        SET @NewOrderID = 0;
        ROLLBACK TRANSACTION;
    END CATCH;

END
GO
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在实体框架和 Sql Server 中创建对象计数器 的相关文章

  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • 使用 SQL Server 作为具有多个客户端的数据库队列

    给定一个充当队列的表 如何最好地配置表 查询 以便多个客户端同时处理队列 例如 下表指示了工作人员必须处理的命令 当worker完成后 它会将处理后的值设置为true ID COMMAND PROCESSED 1 true 2 false
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • C# 事务中的事务

    我正在使用 C 将发票的平面文件导入到数据库中 如果遇到问题 我将使用 TransactionScope 回滚整个操作 这是一个棘手的输入文件 因为一行不一定等于一条记录 它还包括链接记录 发票将包含标题行 行项目和总计行 有些发票需要跳过
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 无法在 Visual Studio 和 vcpkg 中构建 cmake 项目(致命错误 C1083)

    我今天安装了vcpkg 启用了与Visual Studio的集成 即 vcpkg集成安装 并开始安装库 我基本上安装了 cpprestsdk 并触发了 boost 库的安装 然后我在 Visual Studio CMake 中打开该项目 当
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • C# 中不区分大小写的替换不使用正则表达式?

    有没有一种方法可以在不使用 C 中的正则表达式的情况下对字符串进行不区分大小写的替换 像这样的东西 string x Hello x x Replace hello hello world 你可以尝试类似的东西 string str Hel
  • 哪个更快?按引用传递与按值传递 C++

    我认为按引用传递应该比按值传递更快 因为计算机不复制数据 它只是指向数据的地址 但是 请考虑以下 C 代码 include
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • C++ 更改屏幕方向问题 -- DEVMODE dmDisplayOrientation DMDO_90 undefined

    我似乎无法编译一些 C 代码 我正在翻转显示器的方向 但 VS2008 告诉我 DMDO 90 和 DMDO 270 无法识别 error C2065 DMDO 90 undeclared identifier error C2065 DM
  • 多个包含带有变量定义的头文件

    我只是构建一个简单的 C 项目 代码如下所示 head h ifndef HEAD H define HEAD H int my var 100 endif src1 cpp include head h src2 cpp include
  • 我应该使用 Helgrind 还是 DRD 进行线程错误检测?

    好像Valgrind http valgrind org docs manual manual html有两个工具都可以进行线程错误检测 Helgrind http valgrind org docs manual hg manual ht
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • 智能感知不显示评论

    如果我在 Visual Studio 2010 中输入类似的内容数据集1 我得到所有可用方法和属性的列表 智能感知 这很好用 但是 如果我在此列表中选择一个方法或属性 我不会得到 if 的描述 例如 如果我有类似的东西 public cla
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 从 git 签出后 nuget dll 丢失

    I have a C solution containing different projects On those projects I have some normal nuget packages like Newtonsoft Js
  • 在地图上使用 find

    如何使用 find 和 aconst iterator如果你有一个地图定义为 typedef std pair
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht

随机推荐

  • 使用 jQuery 获取相对图像 src

    我的图像标签如下所示 img src path to my image jpg 但是当我使用 jQuery 访问 src 位时 jQuery 会返回 http example com path to my image jpg 这在我正在进行
  • 如何使用数据绑定设置点击侦听器并将 edittext 字段值传递给视图模型

    您好 我正在尝试在我的 Android 应用程序中使用数据绑定和 mvvm 架构 我想在布局中使用数据绑定添加点击侦听器并发送用户名和密码的值edittext到视图模型 它将执行 Web 服务并调用适当的方法LoginActivity li
  • OOP 的实际用途

    我最近和一位不喜欢的同事进行了一场辩论OOP http en wikipedia org wiki Object oriented programming 引起我注意的是他说的话 在对象中进行编码有什么意义 如果是重用 那么我可以创建一个库
  • 当组件因父级已从集合中删除而不再可见时,有没有办法获得通知?

    假设我有一个简单的 JFrame 其中 JTabbedPane 包含 3 个面板 第二个面板包含一个 JComponent 当 Tab 2 面板从其容器中删除时 有没有办法通知 JComponent 我的问题是 JComponent 可能位
  • activerecord 相当于 SQL '减号'

    从另一个查询结果中减去一个查询结果的rails方法是什么 数据库特定的 SQL 示例如下 SELECT Date FROM Store Information MINUS SELECT Date FROM Internet Sales 我将
  • 如何高效地重新编码和计数

    我有一个大的 csv 每行三个字符串 形式如下 a c d c a e f g f a c b c a d b f s c a c 我在前两列中将字符串重新编码为整数 然后删除重复项 计算每行有多少个副本 如下所示 import panda
  • Apps 脚本驱动应用服务 - 创建 Google 类型 - Mime 类型的文件

    我正在使用 createFile的方法DriveApp Folder班级 这是语法 createFile name content mimeType 文档在这里 createFile Google DriveApp 服务 https dev
  • 如何在 C/C++ 中格式化带有千位分隔符的数字

    我正在尝试做这个简单的任务 只是使用 C 或 C 格式化数字 但在 Windows CE 下编程 在这种环境中 inbue 和 setlocale 方法都不起作用 最后我这样做没有成功 char szValue 10 sprintf szV
  • 对 99 位数字长的大数进行因式分解的问题

    号码是 112887987371630998240814603336195913423482111436696007401429072377238341647882152698281999652360869 我的代码如下 def getfa
  • 如何从 Angular 4 更新/升级到 Angular 5+

    我需要将我的项目从 Angular 4 更新到 Angular 5 我需要将以下所有依赖项更改为 Angular 5 我还将 Angular CLI 更新到了 1 5 0 我尝试创建新项目 但似乎只创建了 Angular 4 项目 ng 新
  • 如何在图像内的任意点上旋转(以及可能的动画)图像?

    我正在使用 Flutter 并且希望图像在我定义的点上旋转 例如 我希望图像在其右上角设置旋转 向下摆动 的动画 我该怎么做呢 这是一个使用以下方法的解决方案FractionalOffset https docs flutter io fl
  • 导入错误:没有模块名称 urllib2

    这是我的代码 import urllib2 request response urllib2 urlopen http www google com html response read print html 有什么帮助吗 如中所述urll
  • ajax div 重新加载后 datepicker 不会启动

    我在 div 中有一个 jquery datepicker 通过 ajax 更新 我可以在整个页面重新加载后打开一次日期选择器 但是在ajax仅更新包含日期选择器输入的div后 我看不到日期选择器 我尝试过针对类似问题的解决方案 但没有成功
  • 在 Matlab 中使用 Pochhammer 符号

    我尝试使用一个脚本来评估波赫默符号 http mathworld wolfram com PochhammerSymbol html 上升阶乘 在Matlab中 但它无法评估pochhammer x n 每当x即使表达式在以下情况下有效 也
  • -bash: /usr/local/bin/virtualenvwrapper.sh: 没有这样的文件或目录 #10

    我没有 sudo 特权 当我跑步时 printf n s n s n s virtualenv export WORKON HOME virtualenvs source usr local bin virtualenvwrapper sh
  • 使用遗留头文件作为 c++20 模块

    我正在将旧代码转换为可作为 C 模块导入的代码 问题是我希望它仍然可以工作并且可以像旧的标头 源版本一样轻松维护 我该怎么做 如果可能的话 是否可以创建一个导出标头内容的模块 也可以接受任何其他可以让您维护旧的 cpp h 文件和模块文件的
  • 如何设置列表视图项目的填充?

    我在 Windows 窗体中的大图标视图上有一个列表视图 图像彼此非常接近 那么我如何为项目设置填充呢 ListView 中没有方法可以执行此操作 你可以看一下LVM SETICONSPACING http msdn microsoft c
  • 所有视图中的单个 .NET Core Razor C# 函数

    我知道有一种方法可以在视图中添加 C 函数并使用以下方法调用它们 functions 方法在我的视图中 但是有没有一种方法可以创建一个共享视图 其中包含这些函数以包含在控制器视图内部 而无需在每个视图上复制相同的代码行 我尝试使用 inje
  • 输出文件名,不是带有选择字符串的字符串

    我正在使用 powershell 来 grep 特定字符串的源代码 如果字符串在文件中 我想要文件的名称 而不是包含该字符串的代码行 我还想要文件名 仅一次 而不是与文件存在的次数一样多地列出 我目前正在使用 gci include sql
  • 在实体框架和 Sql Server 中创建对象计数器

    注 1 我重新表述了问题 它现在由供应商和订单组成 而不是汽车和零件 注 2 此问题是假设的 我的目标是了解如何创建对象计数器 为了满足监管要求 我需要对每个供应商的每个订单进行顺序编号 我在用着 实体框架 与 SQL Server In