c# - 如何使用 C# 和 Entity Framework 执行存储过程并忘记它?

标签 c# asp.net sql-server entity-framework stored-procedures

我正在为我使用 ASP.NET MVC 编写的应用程序使用 Entity Framework 。

我需要能够调用一个存储过程然后忘记它。我不关心结果我只想触发它。

我试图通过使用单独的连接来调用使用 ExecuteSqlCommandAsync 方法的存储过程来实现这一点。但是存储过程似乎并没有被解雇。

这是我的异步方法

protected async Task ProcessRecords(DateTime loadedAt, string email)
{
    try
    {
        using (var conn = new AppContext())
        {
            var result = conn.Database.ExecuteSqlCommandAsync("EXEC [DedecatedProcesses] @p0, @p1;", loadedAt, email);
            await Task.WhenAll(result);
        }
    }
    catch (Exception e)
    {
        // Do something with e.Message
    }
}

然后从 Controller 中的 Action 方法中我这样调用它

var loaded = ProcessRecords(DateTime.UtcNow, model.Email);

当我运行我的代码时我没有收到任何错误,但程序没有运行。

当我使用 SSMS 执行存储过程时,它运行没有任何问题。

如何正确调用存储过程而忘记它?

最佳答案

在回答你的问题之前,我想指出这一点:

您创建一个异步任务,如果“正确”使用,您将已经有一个异步调用。事先有什么问题吗?

回答:

await 是默认情况下不会结束当前上下文的调用。在这种情况下,您将在 try 结束时等待 ExecuteSqlCommandAsync。 您可以按如下方式明确删除此行为:

protected async Task ProcessRecords(DateTime loadedAt, string email)
{
    try
    {
        using (var conn = new AppContext())
        {
            await conn.Database.ExecuteSqlCommandAsync("DedecatedProcesses @p0, @p1;", loadedAt, email)
                .ConfigureAwait(false);
        }
    }
    catch (Exception e)
    {
        // Do something with e.Message
    }
}

注意:没有必要在此处存储您的结果。

关于c# - 如何使用 C# 和 Entity Framework 执行存储过程并忘记它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42216103/

相关文章:

c# - 一个类型的多个索引属性?

c# - Prism 事件聚合器无法在单独的模块中工作

ASP.NET 和 jQuery AJAX - 奇怪的问题

sql-server - 使用 Entity Framework 将数据导入和导出到 excel for asp.net mvc

sql - 具有多个搜索词的 SQL 查询

c# - 在 TabControl 中对 TabPages 进行分组

c# - 将基类转换为派生类

c# - 带有 sqlXML 列的大型数据表抛出 System.OutOfMemoryException

c# - 集合上的动态 LINQ?

sql-server - 如何在 SQL Server Always Encrypted 列上使用 Like 运算符?