web-dev-qa-db-fra.com

Comment appeler une procédure stockée dans EF Core 3.0 via fromsqlraw

J'ai récemment migré de EF Core 2.2 à EF Core 3.0.

Malheureusement, je n'ai pas trouvé de moyen d'appeler une procédure stockée qui renvoie une entité.

Dans EF Core 2.0, il était possible:

var spParams = new object[] { "bla", "xx" };
var createdPath = ModelContext.Paths.FromSql("AddNodeWithPathProc  @p0, @p1", spParams).Single();

Dans EF Core 3.0, la méthode FromSQL est remplacée par FromSqlRaw. Cependant, je n'ai pas réussi à appeler avec succès une procédure stockée, puis à traiter la valeur. Ceci est utile lorsque la procédure stockée insère des données dans la base de données.

Donc, dans EF Core 3.0, j'utilise ce code:

var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc @p0, @p1", spParams).Single();

mais cela lancera une exception, car le SQL généré est invalide et ressemble à ceci comme suit:

exec sp_executesql N'SELECT TOP(2) [p].[PathId], [p].[Level], [p].[NodeId], [p].[NodePath], [p].[NodePathString]
FROM (
     @sql @p0, @p1
) AS [p]',N'@p0 nvarchar(4000),@p1 nvarchar(4000), @sql nvarchar(100)',@p0=N'1a',@p1=N'', @sql=N'AddNodeWithPathProc'

J'ai essayé de nombreuses variations, mais sans succès.

Je commence à penser qu'il n'est pas possible d'exécuter des procédures stockées avec ModelContext.[IQueryable].FromSqlRaw. À mon avis, cette gentille défaite l'une des principales raisons de FromSqlRaw car, pour des déclarations de sélection normales, Linq est normalement suffisamment bonne.

Est-ce que quelqu'un sait comment utiliser des procédures stockées en combinaison avec FromSqlRaw dans EF Core 3.0? Toute aide est grandement appréciée.

Merci d'avance

PS: Je sais que vous pouvez exécuter une procédure stockée avec this.Database.ExecuteSqlRaw(SQL, parameters). Cependant, de cette façon, il n'est pas possible de récupérer des entités utilisées par la procédure stockée.

18
Dan

Je ne suis pas là où je peux tester mais je pense que ce qui suit fonctionnera:

var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc {0}, {1}", parm1 parm2).Single();
0
Edney Holder

essayez de séparer sqlparameter:

SqlParameter param1 = new SqlParameter("@p0","value");
SqlParameter param2 = new SqlParameter("@p1","value");

var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc @p0 @p1", param1, 
param2).Single();
0
ISTech