0

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

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

4

3 回答 3

2

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

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

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

如果你仔细想想,这些实体确实服务于两个不同的商业目的。所以有两个实体是有意义的。

最后说明:当然,您可以在实体完成后删除RecordCreation实体Record。但是您没有日志记录,因此对应用程序进行故障排除更加困难。我更喜欢用日期标记它。

于 2013-07-09T20:27:06.163 回答
0

我会为此使用“种子表”。当您“保留”一个新代码时 - 将种子值增加 1 并返回结果。是否要添加实体来执行此操作或仅使用 SQL 取决于您。我个人只会使用 SQL 来降低两个请求获得相同代码的风险。如果您在 SQL 中完成所有操作,您几乎可以通过在一个语句中执行选择和更新来消除:

DECLARE @newID int 

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

SELECT @newID, * FROM SeedTable

由于选择和更新发生在一个语句中,因此您应该避免并发请求。

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

于 2013-07-09T20:40:02.620 回答
0

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

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

于 2013-07-09T20:11:23.063 回答