【问题标题】:Stored Procedure call not working Entrity Framework 5 code first存储过程调用不起作用 Entity Framework 5 代码首先
【发布时间】:2014-09-05 06:29:15
【问题描述】:

我的数据库中有一个存储过程:

ALTER PROCEDURE [dbo].[DeletePaySlip]
    @PayRunId BIGINT,
    @EmployeeId BIGINT
AS
BEGIN
    DECLARE @PaySlipId BIGINT   

    BEGIN TRY
        SELECT @PaySlipId = Id 
        FROM PYREmployeePaySlip 
        WHERE PayRunId = @PayRunId AND EmployeeId = @EmployeeId

        BEGIN TRANSACTION t1

        IF  @PaySlipId IS NOT NULL
        BEGIN
            DELETE FROM PYREmployeePaySlipDetail WHERE PaySlipId = @PaySlipId
            DELETE FROM PYREmployeePaySlip WHERE Id = @PaySlipId
        END

        COMMIT TRANSACTION t1
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION t1
    END CATCH; 

END

如果我从 SQL 查询窗口执行存储过程,它可以工作。

现在我正在尝试从 C# 代码调用存储过程

 public bool DeleteEmployeePaySlip(long payRunId, long employeeId)
 {
            bool success = true;
            var sqlparamPayRunId = new SqlParameter("@PayRunId", payRunId);
            var sqlparamEmployeeId = new SqlParameter("@EmployeeId", employeeId);

            using (var dbContext = new CRMDbContext())
            {                
                try
                {
                    var res = dbContext.Database.SqlQuery<Object>("EXEC DeletePaySlip @PayRunId, @EmployeeId",
                                                       sqlparamPayRunId,
                                                       sqlparamEmployeeId);
                }
                catch (DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        foreach (var ve in eve.ValidationErrors)
                        {

                        }
                    }
                    throw;
                }
            }

            return success;
        }

当我调用上面的方法时,它不会抛出任何错误。但是存储过程似乎没有被调用。

【问题讨论】:

    标签: sql-server-2008 ef-code-first entity-framework-5


    【解决方案1】:

    根据documentation,表达式

     dbContext.Database.SqlQuery<Object>("EXEC DeletePaySlip @PayRunId, @EmployeeId",
                                                       sqlparamPayRunId,
                                                       sqlparamEmployeeId);
    

    ... 将“[c]创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素”。

    所以它返回的(你的对象res)将是这种类型:

    DbRawSqlQuery<object>
    

    这(还)不是查询的结果:它更像是一个查询的封装。在枚举之前,您不会得到结果(从您的角度来看,最重要的是,SQL 不会执行)。

    但实际上,在我看来,您使用了错误的方法来执行您的存储过程。这根本不是查询,而是数据操作。所以试试这个:

     dbContext.Database.ExecuteSqlCommand("EXEC DeletePaySlip @PayRunId, @EmployeeId",
                                                       sqlparamPayRunId,
                                                       sqlparamEmployeeId);
    

    查看here了解更多详情。

    【讨论】:

    • 感谢您的回答。我已经尝试过 ExecuteSqlCommand() 方法,因为我的存储过程是非查询。成功了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2015-02-17
    相关资源
    最近更新 更多