【问题标题】:Call stored procedure in EF 6 Repository Pattern without output parameters在没有输出参数的情况下调用 EF 6 存储库模式中的存储过程
【发布时间】:2015-04-03 12:25:16
【问题描述】:

我正在使用存储库模式和 EF6。我需要做的是调用一个 SP,删除映射表的记录,这些记录在我调用 SP 的存储库中没有任何共同点。

我试过了

this.dbSet.SqlQuery("exec mySP @Param1, @Param2", param1, param2);

但这会从我所在的当前存储库的数据库中返回所有记录。这就像我写了“SELECT * FROM Group”(如果我在 GroupRepository 中)。 我的 SP 没有返回任何内容,因为它正在删除一些记录,而且我已经浪费了 2 天的时间来搜索如何调用 SP。如果需要,我可以提供更多信息。 有人可以帮忙吗?

【问题讨论】:

  • 用提供的代码很难回答;无论如何假设this是一个EF DataContext,你应该试试this.Database.ExecuteSqlCommand("exec mySP @p0, @p1", param1, param2);
  • 谢谢!就是 this.Context.Database.SqlQuery(...)。

标签: entity-framework stored-procedures repository-pattern


【解决方案1】:

最后我设法执行了我的存储过程,它接受了一个 List 和一个 Id。代码如下所示:

SQL 服务器:

CREATE TYPE [dbo].[IntListType] AS TABLE
(   
    [Item] INT 
);
GO

CREATE PROCEDURE [removeEventUsersFromEvents]
(
    @EventIds [dbo].[IntListType] READONLY,
    @UserId INT
)
AS
BEGIN
    BEGIN Tran T1
        DECLARE @query NVARCHAR(MAX)
        SET NOCOUNT ON;
        SET @query = 'DELETE FROM [EventUser]
                      WHERE [EventID] IN (SELECT Item from @EventIds) AND [UserID] = @UserId';
        EXECUTE sp_executesql @query,
            N'@EventIds [dbo].[IntListType] READONLY, @UserId INT',
            @EventIds,
            @UserId;
    COMMIT Tran T1
END;

C#:

    List<int> eventIdsToBeDeleted = this.dbSet...(geting some Ids from the db);

    DataTable dt = new DataTable("IntListType");
    dt.Columns.Add("Item", typeof(Int32));

    eventIdsToBeDeleted.ForEach(id => dt.Rows.Add(id));

    var eventIds = new SqlParameter("EventIds", SqlDbType.Structured);
    eventIds.TypeName = "dbo.IntListType";
    eventIds.Value = dt;

    foreach (var user in usersToBeDeletedFromEvents)
    {
        var userId = new SqlParameter("UserId", SqlDbType.Int);
        userId.Value = user.UserID;

        this.Context.Database.SqlQuery(typeof(List<int>), 
        "EXEC removeCalendarEventUsersFromSpecificGroupAndEvents
        @CalendarEventIds,
        @UserProfileDetailId", 
        eventIds, 
        userId);
   }

这最终会返回一个空列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多