在没有输出参数的情况下,在EF 6 Repository Pattern中调用存储过程

时间:2015-04-03 12:25:16

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

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

我尝试过

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

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

1 个答案:

答案 0 :(得分:2)

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

SQL SERVER:

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);
   }

这最终会返回一个空List&lt; int&gt;。