使用存储过程仅在实体中删除

时间:2013-11-04 17:36:15

标签: c# sql-server-2008 entity-framework stored-procedures asp.net-web-api

这是我想在我的数据库中使用的存储过程:

ALTER PROCEDURE dbo.usp_DeleteExample 
@ExampleID int, @LoggedInUserID int, @SessionID int, @AppID smallint
as

Declare @ExampleName varchar(255)

Set @ExampleName = (Select VehicleName from Example where ExampleID = @ExampleID)

Delete from ExampleToGeofence where ExampleID = @ExampleID;


exec usp_DeleteExampleHistoryData @ExampleID;
Delete From Example where ExampleID = @ExampleID;

Insert into UserActionHistory(ActionID, UserID, SessionID, ItemID, OldValue, ApplicationID, EventUTCDate)
Values (203, @LoggedInUserID, @SessionID, @ExampleID, @ExampleName, @AppID, getutcdate());

这是我正在尝试使用它的代码:

public Example Delete(Example example)
{
    db.Examples.SqlQuery("usp_DeleteExample @ExampleID", 
        new SqlParameter("ExampleID", example.ExampleID)
    );
    db.SaveChanges();

    return example;
}

然而,当我通过我的WebAPI调用它时,没有任何内容被删除。

我在这里做错了什么?如果您需要更多信息,请与我们联系。

谢谢。

编辑:

我刚刚添加的模型构建器配置:

modelBuilder.Entity<Example>()
    .MapToStoredProcedures(e =>
        e.Delete(v => v.HasName("usp_DeleteExample")));

3 个答案:

答案 0 :(得分:3)

SqlQuery用于返回实体。我想你想要ExecuteSQlCommand

public void Delete(Example example)
{
    db.Examples.ExecuteSqlCommand("exec usp_DeleteExample @ExampleID", 
        new SqlParameter("@ExampleID", example.ExampleID)
    );
    return;
}

答案 1 :(得分:2)

我相信你应该使用DbContext.Database .ExecuteSqlCommand。我不知道任何这样的格式DbContext.TableName.ExecuteSqlCommand

    db.Database.ExecuteSqlCommand("usp_DeleteExample @ExampleID, @LoggedInUserID, @SessionID, @AppID ", 
        new SqlParameter("LoggedInUserID", variableName), new SqlParameter("SessionID", variableName),new SqlParameter("AppID ", variableName));     

因为您没有修改实体,所以也不需要调用SaveChanges()。就个人而言,我在设计师中导入SP,因此可以在C#中随时使用。

另请注意,您需要添加其他3个参数,因为所有参数都不是optional

答案 2 :(得分:0)

public HttpResponseMessage Delete(int id)
{
    conn.ConnectionString = @"Data Source=DESKTOP-QRACUST\SQLEXPRESS;Initial Catalog=LeadManagement;Integrated Security=True";
    conn.Open();
    DataTable dt = new DataTable();
    using (conn)
    //data get by query
    //using (var cmd = new SqlCommand("DELETE FROM EmployeeDetails WHERE EmployeeId=3;", conn))
    //data get by sp
    using (var cmd = new SqlCommand("EmployeeDetailsDelete", conn))
    using (var da = new SqlDataAdapter(cmd))
    {
        da.Fill(dt);
    }
    return Request.CreateResponse(HttpStatusCode.OK, dt);
}