web-dev-qa-db-fra.com

Aucun mappage n'existe du type d'objet System.Collections.Generic.List lors de l'exécution d'une procédure stockée avec des paramètres dans EF 4.3.

Dernièrement, j'ai travaillé sur une procédure stockée et j'ai rencontré un problème étrange. 

Tout d'abord, j'ai pu appeler une procédure stockée à partir de la base de données via:

IList <XXXViewModel> XXXList = _context.Database.SqlQuery ("spXXX"). ToList ();

Mais quand j'ai eu besoin de passer des paramètres, cela a échoué:

var parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter("param1", param1Value));
parameters.Add(new SqlParameter("param2", param2Value));
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", parameters).ToList();

Et j'ai eu le ff, erreur:

Aucun mappage n'existe à partir du type d'objet System.Collections.Generic.List`1 [[System.Data.SqlClient.SqlParameter, System.Data, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089]] à un fournisseur géré natif connu type.

Notez que j'ai aussi essayé:

_context.Database.ExecuteSqlCommand<EXEC XXXViewModel>("spXXX @param1, @param2", parameters).ToList();

Mais j'ai eu le même résultat :-(.

J'ai aussi essayé d'appeler, en spécifiant chacun des paramètres:

IList<XXXResult> query = Context.Database.SqlQuery<XXXResult>("SP @paramA, @paramB, @paramC", new SqlParameter("paramA", "A"), new SqlParameter("paramB", "B"), new SqlParameter("paramC", "C")).ToList();

Quelqu'un a une idée?

27
czetsuya

Vous devez transmettre chaque paramètre à la méthode (vous ne pouvez pas transmettre une liste)

IList<XXXViewModel> XXXList =
     _context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", 
     new SqlParameter("param1", param1Value), 
     new SqlParameter("param2", param2Value)).ToList();
32
Eranga

Au cas où quelqu'un d'autre croiserait ça ...

J'ai créé les paramètres sous forme de liste, puis dans l'appel SqlQuery je l'ai passé avec un .ToArray (). Travaillé pour moi Voici le code modifié ci-dessous ...

var parameters = new List<object>(); 
parameters.Add(new SqlParameter("param1", param1Value)); 
parameters.Add(new SqlParameter("param2", param2Value)); 
IList<XXXViewModel> XXXList = 
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", parameters.ToArray()).ToList(); 
41
Edyn

La solution à ce problème (dans mon cas était)

 var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms);

Où requête était une chaîne contenant des paramètres tels que @Name, etc. .. La variable parms était une liste de SQLParameters. SQL n'aime pas les listes génériques ....

SQL doit avoir un tableau de SQLParameters envoyé en tant que et objet [] et non une liste de type générique.

var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());
4
John Peters

Dans mon cas, le paramètre SQL type et la gestion des valeurs NULL ont résolu ce problème. Il lançait la même exception No mapping exists from object type System.RuntimeType to a known managed provider native type. pour cela aussi

var parameter1 = new SqlParameter("parameter1", typeof(string));
var parameter2 = new SqlParameter("parameter2", typeof(string));
var parameter3 = new SqlParameter("parameter3", typeof(string));

parameter1.Value = string.IsNullOrEmpty(parameter1Value) ? (object)DBNull.Value : parameter1Value;
parameter2.Value = string.IsNullOrEmpty(parameter2Value) ? (object)DBNull.Value : parameter2Value;
parameter3.Value = string.IsNullOrEmpty(parameter3Value) ? (object)DBNull.Value : parameter3Value;

http://karim-medany.blogspot.ae/2014/02/no-mapping-exists-from-object-type.html

1
Ali Umair

erland Sommarskog a publié un article sur l'utilisation des paramètres à valeur de table dans SQL Server et .NET. 

http://www.sommarskog.se/arrays-in-sql-2008.html

Capable de transmettre une quantité variable d'arguments du client en utilisant un seul paramètre.

0
darkstar