c# - 如何防止 SQL Server 存储过程与 EF 并发执行?

标签 c# sql sql-server entity-framework

我正在使用 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/

相关文章:

c# - 刷新更新面板后重定向

c# - 存储此类信息的适当方式

SQL Server - sp_procoption 用参数标记过程

sql-server - Invoke-Sqlcmd 不允许 -E 开关?

sql-server - 主键表的一部分的外键

c# - 将数字分解为 2 个质数余因子

sql - 从 rails 5 获取随机记录,但在顶部保留一条记录(基于某个值)

sql - 从表 SQL 中查找 Maximum(table.column1,table.column2,table.column3,...) 为 'MaximumValue'

c# - 使用具有单个 DbContext 和 Entites 的多个数据库并在运行时生成 Conn String

c# - Sitecore 管道干扰 WebMethod (asmx) 调用