2017-02-14 17 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:有沒有點在這裏保存你的結果。