Executar procedimento armazenado no EF Core 3.0 vs 2.2

8

Estou tentando atualizar meu código para acomodar alterações no EF Core 3.0, especificamente a descontinuação de ExecuteSqlCommand.

O código a seguir estava funcionando na versão 2.2, mas conforme indicado, preciso me livrar ExecuteSqlCommand:

SqlParameter srcid = new SqlParameter("@srcCharacterId", participantApplication.CharacterId);
SqlParameter newid = new SqlParameter("@newCharacterId", newCharacterId);
SqlParameter pResult = new SqlParameter
{
    ParameterName = "@pResult",
    SqlDbType = System.Data.SqlDbType.Bit,
    Direction = System.Data.ParameterDirection.Output
};

_db.Database.ExecuteSqlCommand("pCharacterCopy @srcCharacterId, @newCharacterId, @pResult OUTPUT", srcid, newid, pResult);

Tentei alterar a chamada para ExecuteSqlRaw(deixando tudo idêntico), mas isso, embora seja compilado, gera a seguinte exceção em tempo de execução:

O SqlParameterCollection aceita apenas objetos do tipo SqlParameter não nulos, não objetos do SqlParameter

Eu verifiquei com o depurador e nenhum deles SqlParameteré nulo. Suspeito que minha chamada para ExecuteSqlRawnão esteja formatada corretamente, mas não consigo encontrar nenhum outro exemplo que não seja a integração de chamadas nas consultas do Linq que não preciso fazer. Eu só quero acionar a chamada para o procedimento armazenado e dar uma olhada no parâmetro de saída quando terminar.

Steven Frank
fonte

Respostas:

10

Isso provavelmente ocorre devido à mudança para Microsoft.Data.SqlClient .

Remova a referência ao assembly System.Data.SqlClient e substitua os espaços para nome.

using System.Data.SqlClient; => using Microsoft.Data.SqlClient;

Angel Yordanov
fonte
Parece funcionar perfeitamente, obrigado!
Steven Frank