Jun*_*ior 5 c# sql-server asp.net stored-procedures entity-framework
我正在为使用ASP.NET MVC编写的应用程序使用实体框架。
我需要能够调用存储过程并忘记它。我不在乎只想触发它的结果。
我试图通过使用单独的连接来使用该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
}
}
Run Code Online (Sandbox Code Playgroud)
然后从控制器中的动作方法像这样调用它
var loaded = ProcessRecords(DateTime.UtcNow, model.Email);
Run Code Online (Sandbox Code Playgroud)
运行代码时没有出现任何错误,但是该过程未运行。
当我使用SSMS执行存储过程时,它运行没有问题。
我该如何正确调用存储过程而忘却它?
小智 1
在回答你的问题之前,我想指出这一点:
您创建一个异步任务,如果“正确”使用,您将已经有一个异步调用。之前有什么不对吗?
回答 :
await默认情况下,该调用不会结束当前上下文。ExecuteSqlCommandAsync在这种情况下,您将在 结束时等待try。您可以显式删除此行为,如下所示:
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
}
}
Run Code Online (Sandbox Code Playgroud)
注意:没有必要在此处存储您的结果。