我正在使用 Entity Framework 6 Database.SqlQuery 语句来执行存储过程。我想防止两个用户同时执行同一个存储过程。
最佳答案
如果所有调用存储过程的客户端都调用 ExecuteStoredProcedure
Web 服务,则以下代码将正常工作:
private Object thisLock = new Object();
public List<TResult> ExecuteStoredProcedure<TResult>(string storedProcedureName, object parameters) where TResult : new()
{
lock (thisLock)
{
Type type = typeof(TResult);
StringBuilder sb = new StringBuilder();
sb.Append($"EXEC {storedProcedureName}");
if (parameters == null)
parameters = new { };
var properties = parameters.GetType().GetProperties();
object[] values = new object[properties.Length];
for (int i = 0; i < properties.Length; i++)
{
sb.Append("@");
sb.Append(properties[i].Name);
sb.Append("=");
sb.Append("@p");
sb.Append(i);
if (i < properties.Length - 1)
{
sb.Append(",");
}
values[i] = properties[i].GetValue(parameters);
}
if (type == typeof(ActionModel) || type.BaseType == typeof(ActionModel))
{
sb.AppendLine("");
sb.AppendLine("WITH RESULT SETS ((IsValid BIT NULL,Id BIGINT NULL,Message NVARCHAR(MAX) NULL));");
}
return Database.SqlQuery<TResult>(sb.ToString(), values).ToList();
}
}
关于c# - 如何防止 SQL Server 存储过程与 EF 并发执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51578355/