Конечно, вы можете сделать это с помощью LINQ, а также безопасно:
- Оберните доступ к базовой таблице SystemValues в функции «GetIDValue ..... ()» в TRANSACTION (а не с уровнем изоляции READUNCOMMITTED!), Тогда один и только один пользователь сможет получить доступ к этой таблице на любом данное время, и вы сможете безопасно распространять удостоверения личности
- вызовите этот сохраненный процесс из LINQ непосредственно перед сохранением вашей сущности и сохраните идентификатор, если вы имеете дело с новой сущностью (если идентификатор еще не установлен)
- сохранить вашу сущность в базе данных
Это должно сработать - не уверен, если это будет быстрее и эффективнее, чем позволить базе данных справиться с работой - но это должно работать - и безопасно.
Марк
UPDATE:
Примерно так (адаптироваться к вашим потребностям) будет работать безопасно:
CREATE PROCEDURE dbo.GetNextTableID(@TableID INT OUTPUT)
AS BEGIN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
UPDATE SystemTables
SET MaxTableID = MaxTableID + 1
WHERE ........
SELECT
@TableID = MaxTableID
FROM
dbo.SystemTables
COMMIT TRANSACTION
END
Что касается производительности - до тех пор, пока у вас есть разумное число (возможно, менее 50) одновременно работающих пользователей, и если эти таблицы SystemTables
не используются для чего-то еще, то они должны работать нормально.