我在 SQL Server 中有一个表,我使用 Entity Framework 来处理 SQL Server 数据库。当用户单击按钮以在保存记录之前将新记录添加到表中时,我想为新记录(表的新实体)保留代码,因此当另一个用户单击按钮以添加新记录时,新代码(lastcode + 1)在保存记录之前为其保留。
如何在 C# 和实体框架中实现这一点?有任何想法吗?
我在 SQL Server 中有一个表,我使用 Entity Framework 来处理 SQL Server 数据库。当用户单击按钮以在保存记录之前将新记录添加到表中时,我想为新记录(表的新实体)保留代码,因此当另一个用户单击按钮以添加新记录时,新代码(lastcode + 1)在保存记录之前为其保留。
如何在 C# 和实体框架中实现这一点?有任何想法吗?
@Jean-Bernard Pellerin 的回答肯定会奏效。但我不喜欢这种方法的一点是,除了 ID 之外的所有列都必须可以为空,或者设置了可能对实体没有意义的默认值。因此,我尽量避免在创建实体之前为其保留代码或 ID 的要求。
但有时你无法避免它。在这种情况下,我将实体拆分为两个不同的实体——一个用于实际实体,另一个用于跟踪创建它的过程。例如,如果您的记录是Record
实体,那么您也将拥有一个RecordCreation
实体。RecordCreation
有一个用于保留代码值的属性,它还有一个可以为空的 DateTime 属性,名为DateComplete
. 当你去创建一个新实体时,你实际上是在创建RecordCreation
实体,并设置它的代码值——这会保留它的代码。稍后,当您准备好创建实际实体时,您还会更新该DateComplete
列。这有几个优点:
如果你仔细想想,这些实体确实服务于两个不同的商业目的。所以有两个实体是有意义的。
最后说明:当然,您可以在实体完成后删除RecordCreation
实体Record
。但是您没有日志记录,因此对应用程序进行故障排除更加困难。我更喜欢用日期标记它。
我会为此使用“种子表”。当您“保留”一个新代码时 - 将种子值增加 1 并返回结果。是否要添加实体来执行此操作或仅使用 SQL 取决于您。我个人只会使用 SQL 来降低两个请求获得相同代码的风险。如果您在 SQL 中完成所有操作,您几乎可以通过在一个语句中执行选择和更新来消除:
DECLARE @newID int
UPDATE SeedTable
SET NextID = NextID + 1,
@newID = NextID
SELECT @newID, * FROM SeedTable
由于选择和更新发生在一个语句中,因此您应该避免并发请求。
一个缺点是不能保证代码是连续的。如果您保留一个号码但不使用它,您将在号码上出现缺口。这不应该是一个问题,但有些人会因为连续
当用户开始创建新项目时,在数据库中添加一个占位符。
使用 GUID 或其他类似不同的内容填充其中一个字段。
查找具有匹配 GUID 的项目并获取其代码。
那是您的保留代码。
当用户准备好保存时,只需更新现有的占位符记录。
如果用户取消创建,请记住删除占位符。