保留新记录的代码

时间:2013-07-09 20:08:15

标签: c# sql-server entity-framework

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

如何在C#和Entity Framework中实现此功能?有什么想法吗?

3 个答案:

答案 0 :(得分:2)

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

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

  1. 您没有部分完整的实体,这些实体从未为您的数据库创建过程。
  2. 您有尝试创建一个从未完成的实体的记录,并且您有成功尝试的记录。
  3. 如果您考虑一下,这些实体确实可以实现两个不同的业务目的。所以有两个实体是有意义的。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

DECLARE @newID int 

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

SELECT @newID, * FROM SeedTable

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

一个缺点是代码不能保证是连续的。如果您保留一个号码但不使用它,则数字会有差距。这不应该是一个问题,但有些人得到关于连续的肛门