int не содержит определения для Getawaiter + asp.net core web api async

Я пытаюсь реализовать асинхронную функциональность CRUD для своего приложения, используя ядро ​​​​webapi asp.net. Мне сказали использовать только хранимые процедуры для любых запросов к базе данных. Я реализовал асинхронность для запроса на получение, но изо всех сил пытался сделать то же самое для запроса на создание. Может ли кто-нибудь сказать мне, что я делаю неправильно в своем коде?

Я получаю следующее сообщение об ошибке в моем методе репозитория в строке кода ожидания

введите здесь описание изображения

Метод контроллера:

[HttpPost]
[Route("api/Movies")]
public async Task<IActionResult> CreateMovie([FromBody] MoviesDto movies)
{
    if (movies == null)
    {
        return BadRequest();
    }

    // Check if movie exists
    var movie =  _moviesRepository.GetMovie(movies.MovieId);

    if (movie == null)
    {
        return NotFound();
    }

    var results = Mapper.Map<Movies>(movies);

    if (ModelState.IsValid)
    {
        await _moviesRepository.AddMovie(results);
    }

    return Ok(results);
}

Метод репозитория:

public async Task AddMovie(Movies movie)
{
    await _mrdbContext.Database.ExecuteSqlCommand("dbo.spInsertMovie {0}, {1}, {2}, {3}, {4}, {5}", movie.Title,movie.ReleaseYear,movie.Plot,movie.MovieLength,"Ranjit Menon","");
}

Новый метод репозитория:

public async Task AddMovie(Movies movie)
{
    object[] parameters =
            {
                new SqlParameter("@val1", movie.Title),
                new SqlParameter("@val2", movie.ReleaseYear),
                new SqlParameter("@val3", movie.Plot),
                new SqlParameter("@val4", movie.MovieLength),
                new SqlParameter("@val5", "Ranjit Menon"),

                new SqlParameter
                {
                    ParameterName = "@retVal",
                    SqlDbType = SqlDbType.Int,
                    Direction = ParameterDirection.Output,
                    Value = -1
                }
        };

    await  _mrdbContext.Database.ExecuteSqlCommandAsync("EXEC  @retVal = dbo.spInsertMovie @val1, @val2, @val3, @val4,@val5", CancellationToken.None , parameters);
}

Хранимая процедура:

CREATE PROCEDURE [dbo].[spInsertMovie]
    (@Title varchar(50),  
     @ReleaseYear int, 
     @Plot varchar(50), 
     @MovieLength int, 
     @CreatedBy varchar(20)
    )
AS
BEGIN
    set nocount on

    ----------------------------------------
    -- variables
    ----------------------------------------

    -- error
    declare @ErrorMessage nvarchar(2048), @ErrorSeverity int, @ErrorState int, @MovieID int

    ----------------------------------------
    -- insert record
    ----------------------------------------

    begin try


        -- insert record
            insert into [dbo].[Movies]
                       ([Title]
                       ,[ReleaseYear]
                       ,[Plot]
                       ,[MovieLength]                      
                       ,[CreatedBy]                    
                       ,[UpdatedBy])
            values
                       (@Title
                       ,@ReleaseYear
                       ,@Plot
                       ,@MovieLength                     
                       ,@CreatedBy
                       ,@CreatedBy)


        -- get assigned id
        set @MovieID = scope_identity()



    end try
    begin catch
        select @ErrorMessage = dbo.fnGetErrorMessage('Insert Movie Record', error_message(), object_schema_name(@@procid), object_name(@@procid), error_line()), @ErrorSeverity = error_severity(), @ErrorState = error_state();
        raiserror(@ErrorMessage, @ErrorSeverity, @ErrorState);
        return
    end catch

    -- return assigned id
    select @MovieID as MovieID

END

person Tom    schedule 30.05.2017    source источник


Ответы (1)


ExecuteSqlCommand скорее всего возвращает int, а не задачу. Вместо этого используйте ExecuteSqlCommandAsync. https://msdn.microsoft.com/en-us/library/system.data.entity.database.executesqlcommandasync(v=vs.113).aspx

person Andrei Tătar    schedule 30.05.2017
comment
Я только что добавил новый метод репозитория в соответствии с вашим предложением. Однако я не вижу, чтобы процедура вызывалась. Я включил свой профилировщик, чтобы перехватить звонок. Я протестировал свою хранимую процедуру в бэкэнде, передав те же значения параметров, и она отлично работает, возвращая только что сгенерированный идентификатор фильма. Я также обновил сообщение, чтобы оно содержало storeprocedure - person Tom; 30.05.2017
comment
@Tom это выдает исключение или терпит неудачу каким-либо образом? - person Andrei Tătar; 30.05.2017
comment
Привет, Эндрю, я не вижу никаких исключений, из-за чего мне трудно понять, почему это не работает. - person Tom; 30.05.2017