webentwicklung-frage-antwort-db.com.de

Beim Ausführen des gespeicherten proc mit Parametern in EF 4.3 ist keine Zuordnung vom Objekttyp System.Collections.Generic.List vorhanden

In letzter Zeit habe ich an gespeicherten Prozeduren gearbeitet und bin auf ein seltsames Problem gestoßen. 

Zunächst konnte ich eine gespeicherte Prozedur erfolgreich von der Datenbank aus aufrufen:

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

Als ich Parameter übergeben musste, schlug das fehl:

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();

Und ich bekam den ff, Fehler:

Zu Objekttyp .__ existiert keine Zuordnung. System.Collections.Generic.List`1 [[System.Data.SqlClient.SqlParameter, System.Data, Version = 4.0.0.0, Kultur = neutral, PublicKeyToken = b77a5c561934e089]] an ein bekanntes verwaltetes Provider-Native Art.

Beachten Sie, dass ich auch versucht habe:

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

Habe aber das gleiche Ergebnis bekommen :-(.

Ich habe auch versucht aufzurufen, indem ich jeden der Parameter spezifizierte:

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

Hat jemand eine Idee?

27
czetsuya

Sie müssen jeden Parameter an die Methode übergeben (dh Sie können keine Liste übergeben).

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

Falls jemand anderes darauf stößt ...

Ich habe die Parameter als Liste erstellt und dann im SqlQuery-Aufruf mit einem .ToArray () übergeben. Arbeitete für mich. Hier ist der modifizierte Code unten ...

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

Die Lösung für dieses Problem (in meinem Fall war)

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

Die Abfrage war eine Zeichenfolge, in die Parameter eingefügt wurden, z. B. @Name usw. Die Variable parms war eine Liste von SQL-Parametern. SQL mag keine generischen Listen.

SQL muss ein Array von SQLParameters haben, das als und object [] gesendet wird, und keine Liste eines generischen Typs.

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

In meinem Fall lösten SQL type-Parameter und die Verarbeitung von Nullwerten dieses Problem. Es gab die gleiche Ausnahme No mapping exists from object type System.RuntimeType to a known managed provider native type. auch für diesen Fall

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

sQL Server-Version wurde nicht angegeben, aber Erland Sommarskog hat einen Artikel zur Verwendung von Tabellenwertparametern in SQL Server und .NET veröffentlicht. 

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

Kann eine variable Anzahl von Argumenten mit einem einzigen Parameter vom Client übergeben.

0
darkstar

Wenn die gespeicherte Prozedur nur zum Aktualisieren/Einfügen vorgesehen ist, kann auch Folgendes verwendet werden.

string cmd = Constants.StoredProcs.usp_AddRoles.ToString() + " @userId, @roleIdList";
int result = db.Database
                        .ExecuteSqlCommand
                        (
                           cmd,
                           new SqlParameter("@userId", userId),
                           new SqlParameter("@roleIdList", roleId)
                        );
0