2017-02-14 8 views
2

Я использую Entity Framework для приложения, которое я написал с помощью ASP.NET MVC.Как выполнить хранимую процедуру и забыть об этом с помощью C# и 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 
    } 
} 

Тогда из метода действия с в контроллере я называю это как так

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

Я не получаю ошибку, когда я запускаю мой код, но процедура не запускается.

Когда я выполняю хранимую процедуру с использованием SSMS, она работает без проблем.

Как я могу правильно вызвать хранимую процедуру и забыть об этом?

+0

'EXEC' требуется только в том случае, если в заявлении имеется более одной строки, поэтому в коде нет необходимости. – Dalorzo

+0

@Dalorzo Спасибо за удар. Но подскажите, как вызвать SP и забыть об этом? –

+2

Сначала попробуйте запустить без инкапсулирующего асинхронного метода. и убедитесь, что вы правильно вызываете процедуру. Обычно я запускаю свои procs в Entity, добавляя его в модель, используя «функцию import» – DaniDev

ответ

0

Прежде чем ответить на ваш вопрос, я хочу, чтобы указать на это:

Вы создаете задачу асинхронной, если «правильно» используется вы уже вызов асинхронной. Что-то неправильно заранее?

Ответ:

await это вызов, который не закончится ваш curent контекста по умолчанию. В этом случае вы будете ждать 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 
    } 
} 

NB: Там нет смысла хранить результат здесь.