При выполнении сохраненного процесса с параметрами в EF 4.3 сопоставления не существует из типа объекта System.Collections.Generic.List. - PullRequest
27 голосов
/ 05 февраля 2012

В последнее время я работаю над хранимой процедурой и столкнулся с 1 странной проблемой.

Сначала я смог успешно вызвать хранимую процедуру из базы данных с помощью:

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

Но когда мне нужно было передать параметры, это не удалось:

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

И я получил ff, ошибка:

Нет сопоставления для типа объекта System.Collections.Generic.List`1 [[System.Data.SqlClient.SqlParameter, System.Data, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089]] известному управляемому провайдеру тип.

Обратите внимание, что я тоже пробовал:

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

Но получил тот же результат: - (.

Также я попытался позвонить, указав каждый из параметров:

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

У кого-нибудь есть идеи?

Ответы [ 7 ]

44 голосов
/ 29 марта 2012

В случае, если кто-то еще сталкивается с этим ...

Я создал параметры в виде списка, а затем в вызове SqlQuery передал его с помощью .ToArray ().Работал на меня.Вот модифицированный код ниже ...

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(); 
32 голосов
/ 05 февраля 2012

Вам необходимо передать каждый параметр в метод (т.е. вы не можете передать список)

IList<XXXViewModel> XXXList =
     _context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2", 
     new SqlParameter("param1", param1Value), 
     new SqlParameter("param2", param2Value)).ToList();
4 голосов
/ 14 октября 2014

Решение этой проблемы (в моем случае это было)

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

Где запрос - это строка, в которую были вставлены параметры, такие как @Name и т. Д. Переменная parms была списком SQLParameters.SQL не любит универсальные списки ....

SQL должен иметь массив SQLParameters, отправляемых как и объект [], а не список универсального типа.

var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());
1 голос
/ 04 октября 2016

В моем случае параметр SQL type и обработка нулевых значений решили эту проблему. Это бросало то же исключение No mapping exists from object type System.RuntimeType to a known managed provider native type. для этого также

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 / нет-отображение-не существует, из-объектного type.html

0 голосов
/ 15 марта 2019

Если хранимая процедура предназначена только для обновления / вставки, также можно использовать следующее:

string cmd = Constants.StoredProcs.usp_AddRoles.ToString() + " @userId, @roleIdList";
int result = db.Database
                        .ExecuteSqlCommand
                        (
                           cmd,
                           new SqlParameter("@userId", userId),
                           new SqlParameter("@roleIdList", roleId)
                        );
0 голосов
/ 07 ноября 2018

не указывал версию SQL Server, но Эрланд Соммарског имеет статью о том, как использовать табличные параметры в SQL Server и .NET.

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

Может передавать переменное количество аргументов от клиента, используя один параметр.

0 голосов
/ 30 августа 2013

Вы также можете использовать string.Format для передачи параметров в хранимую процедуру

string command = string.Format("EXEC spXXX {0},{1}", param1Value, param2Value);
IList<XXXViewModel> XXXList = 
  _context.Database.SqlQuery<XXXViewModel>(command).ToList();
...