2017-02-14 62 views
2

我正在使用实体框架来编写使用ASP.NET MVC编写的应用程序。如何执行存储过程并忘记使用C#和实体框架?

我需要能够调用存储过程并忘记它。我不关心我只是想触发它的结果。

我试图通过使用单独的连接来调用使用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 
    } 
} 

然后从操作方法与控制器我把它像这样

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

运行我的代码,我没有得到任何错误,但程序不运行。

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

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

+0

只有当语句中有多行时才需要'EXEC',因此在您的代码中没有必要使用 – Dalorzo

+0

@Dororzo感谢您的支持。但是关于如何触发SP并忘记它的任何线索? –

+2

首先尝试运行而不使用封装异步方法。并确保您正确调用过程。 我通常通过使用“功能导入”将模型添加到模型中来运行我的实体中的特效。 – DaniDev

回答

0

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

您创建一个异步任务,如果“正确”使用你已经有了一个异步调用。事前有什么错误?

答:

await是,默认情况下不会结束你CURENT情境中的呼叫。在这种情况下,您将在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 
    } 
} 

NB:有没有点在这里保存你的结果。