在没有输出参数的情况下调用 EF 6 存储库模式中的存储过程
Call stored procedure in EF 6 Repository Pattern without output parameters
我正在使用存储库模式和 EF6。我需要做的是调用一个 SP 来删除映射记录 table,这些记录在我调用 SP 的存储库中没有任何共同之处。
我试过
this.dbSet.SqlQuery("exec mySP @Param1, @Param2", param1, param2);
但是这个 returns 我所在的当前存储库的数据库中的所有记录。就像我写的 "SELECT * FROM Group" (如果我在 GroupRepository 中)。
我的 SP returns 什么都没有,因为它删除了一些记录,我已经浪费了 2 天时间搜索如何调用 SP。如果需要,我可以提供更多信息。
有人可以帮忙吗?
最后我设法执行了我的存储过程,它接受一个 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);
}
这最终会 return 一个空的 List。
我正在使用存储库模式和 EF6。我需要做的是调用一个 SP 来删除映射记录 table,这些记录在我调用 SP 的存储库中没有任何共同之处。
我试过
this.dbSet.SqlQuery("exec mySP @Param1, @Param2", param1, param2);
但是这个 returns 我所在的当前存储库的数据库中的所有记录。就像我写的 "SELECT * FROM Group" (如果我在 GroupRepository 中)。 我的 SP returns 什么都没有,因为它删除了一些记录,我已经浪费了 2 天时间搜索如何调用 SP。如果需要,我可以提供更多信息。 有人可以帮忙吗?
最后我设法执行了我的存储过程,它接受一个 List
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);
}
这最终会 return 一个空的 List