我在SQL Server中有一个表,我使用Entity Framework来处理SQL Server数据库。当用户在保存记录之前单击按钮将新记录添加到表中时,我想保留新记录的代码(表的新实体),所以当另一个用户单击按钮添加新记录时新代码(lastcode + 1)在保存记录之前为它保留。
如何在C#和Entity Framework中实现此功能?有什么想法吗?
答案 0 :(得分:2)
@ Jean-Bernard Pellerin的回答肯定会奏效。但我不喜欢这种方法的是,除了ID之外的所有列都必须是可空的,或者设置的默认值可能对实体没有意义。因此,我尝试避免在创建实体之前为实体保留代码或ID的要求。
但有时你无法避免它。在这种情况下,我将实体分成两个不同的实体 - 一个用于实际实体,另一个用于跟踪创建它的过程。例如,如果您的记录是Record
实体,那么您还可以拥有RecordCreation
实体。 RecordCreation
具有保留代码值的属性,并且还具有名为DateComplete
的可为空的DateTime属性。当你去创建一个新实体时,你实际创建了RecordCreation
实体,并设置了它的代码值 - 这保留了它的代码。然后,当您准备创建实际实体时,还会更新DateComplete
列。这有几个好处:
如果您考虑一下,这些实体确实可以实现两个不同的业务目的。所以有两个实体是有意义的。
最后注意事项:当然,您可以在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
由于选择和更新发生在一个语句中,因此您应该对并发请求安全。
一个缺点是代码不能保证是连续的。如果您保留一个号码但不使用它,则数字会有差距。这不应该是一个问题,但有些人得到关于连续的肛门