C# 为新记录保留一个代码

C# 为新记录保留一个代码,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我在SQLServer中有一个表,我使用实体框架来处理SQLServer数据库。当用户在保存记录之前单击按钮将新记录添加到表中时,我希望为新记录保留表的新实体的代码,因此当另一个用户在保存记录之前单击按钮添加新记录时,需要为其保留新代码lastcode+1 如何在C和实体框架中实现这一点?有什么想法吗?当用户开始创建新项目时,在数据库中添加一个占位符。 使用GUID或其他类似不同的内容填充其中一个字段。 查找具有匹配GUID的项并获取其代码。 这是您的保留代码 当用户准备好保存时,只需更新现有占

我在SQLServer中有一个表,我使用实体框架来处理SQLServer数据库。当用户在保存记录之前单击按钮将新记录添加到表中时,我希望为新记录保留表的新实体的代码,因此当另一个用户在保存记录之前单击按钮添加新记录时,需要为其保留新代码lastcode+1


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

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

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

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

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

您没有未完成创建的部分完整的实体,这些实体是在您的数据库中创建的。 您有一个尝试创建一个从未完成的实体的记录,并且您有一个成功尝试的记录。 仔细想想,这些实体确实有两个不同的商业目的。所以有两个实体是有意义的


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

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

DECLARE @newID int 

UPDATE SeedTable 
SET NextID = NextID + 1,
    @newID = NextID

SELECT @newID, * FROM SeedTable
由于select和update发生在一条语句中,因此您应该不会受到并发请求的影响


一个缺点是不能保证代码是连续的。如果你保留了一个号码,但不使用它,你将在号码上有一个缺口。这本不应该是个问题,但有些人会对连续的

代码表示不满?你是说你想在插入记录之前存储记录的PK值吗?@Jim No.代码是我表格中的另一个字段如果你使用的是SQL Server 2012,你可以看看使用a来实现这一点。否则,您将不得不等待直到插入行,并使用INT-IDENTITY列,该列在插入时自动获取值happens@marc_s我使用SQLServer2008R2。我想在保存记录之前保留一个代码