为新记录保留一个代码

本文关键字:一个 代码 新记录 保留 | 更新日期: 2023-09-27 18:21:47

我在SQL Server中有一个表,我使用实体框架来处理SQL Server数据库。当用户在保存记录之前点击按钮将新记录添加到表中时,我想为新记录(表的新实体)保留一个代码,所以当另一个用户点击按钮添加新记录时,在保存记录前为其保留的新代码(lastcode+1)。

我如何在C#和实体框架中实现这一点?有什么想法吗?

为新记录保留一个代码

@Jean-Bernard Pellerin的答案肯定会奏效。但我不喜欢这种方法的一点是,除了ID之外的所有列都必须可以为null,或者设置了可能对实体没有意义的默认值。因此,我尽量避免在创建实体之前为其保留代码或ID的要求。

但有时你无法避免。在这种情况下,我将实体拆分为两个不同的实体——一个用于实际实体,另一个用于跟踪创建过程。例如,如果你的记录是Record实体,那么你也会有一个RecordCreation实体。RecordCreation有一个用于保留代码值的属性,它还有一个名为DateComplete的可为null的DateTime属性。当你去创建一个新的实体时,你实际上创建了RecordCreation实体,并设置了它的代码值——这将保留它的代码。稍后,当您准备好创建实际实体时,还将更新DateComplete列。这有几个优点:

  1. 您没有部分完整的实体,这些实体从未在数据库中完成创建
  2. 您有创建一个从未完成的实体的尝试记录,也有成功的尝试记录

如果你仔细想想,这些实体确实有两个独立的商业目的。因此,有两个实体是有意义的。

最后注意:当然,一旦Record实体完成,您就可以删除RecordCreation实体。但是你没有日志记录,所以对应用程序进行故障排除更困难。我更喜欢用日期来标记它。

当用户开始创建新项目时,在数据库中添加一个占位符
用GUID或其他类似的不同内容填充其中一个字段
查找具有匹配GUID的项目并获取其代码
这是您的保留代码。

当用户准备好保存时,只需更新现有的占位符记录
如果用户取消创建,请记住删除占位符。

我会使用一个"种子表"。当您"保留"一个新代码时,将种子值增加1并返回结果。您是想添加实体来实现这一点,还是只使用SQL,这取决于您自己。我个人只想使用SQL来降低两个请求获得相同代码的风险。如果您在SQL中完成所有操作,那么通过在一条语句中执行选择和更新,您实际上可以省略:

DECLARE @newID int 
UPDATE SeedTable 
SET NextID = NextID + 1,
    @newID = NextID
SELECT @newID, * FROM SeedTable

由于选择和更新发生在一个语句中,因此您应该不会受到并发请求的影响。

一个缺点是代码不能保证是连续的。如果你保留了一个号码,但不使用它,你的号码就会有差距。这不应该是一个问题,但有些人会对连续感到恼火