【问题标题】:Using Stored Procedure for only delete in Entity使用存储过程仅在实体中删除
【发布时间】:2021-12-14 23:02:30
【问题描述】:

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

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配置:

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

【问题讨论】:

  • 您是否通过模型浏览器导入了存储过程?这是针对看似名为 Examples 的表运行的查询。对我来说似乎有点奇怪......
  • 你有什么错误吗?您似乎只传递了一个过程显然需要更多参数的参数。此外,在 DB 上运行跟踪以查看 PROC 是否真的被调用
  • 谢谢。程序底部有一个插入。构建中还没有。删除应该可以在没有这些参数的情况下工作,对吧?
  • 否,因为如果您的 proc 需要 3 个参数而您只传递一个,则调用将失败,因此不会发生任何事情
  • 如果使用MapToStoredProcedures,则无需在代码中调用存储过程。您知道MapToStoredProcedures 的含义和作用吗?

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


【解决方案1】:

我相信你应该使用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】:

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

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

【讨论】:

  • 谢谢。 ExecuteSqlCommand() 没有出现,即使被引用。我最近升级到Entity 6.0,但我仍在使用VS2010。它在 E6.0 中不再可用吗?
【解决方案3】:

使用存储过程进行 CRUD 操作似乎存在某种限制。

您必须将插入、更新和删除存储过程映射到实体 如果您想使用存储过程进行 CUD 操作。仅映射 其中之一是不允许的。

Source

【讨论】:

  • 他们可能这样做了。无论哪种方式,问题中的错误只不过是调用参数不足的存储过程。
【解决方案4】:
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);
}

【讨论】:

  • 您能否指出这如何回答问题以及它如何补充现有答案?仅代码的答案在 Stack Overflow 上被认为不是很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2011-09-19
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多