Отсутствует сопоставление типа объекта System.Collections.Generic.List при выполнении хранимой процедуры с параметрами в EF 4.3
В последнее время я работал над хранимой процедурой и столкнулся с одной странной проблемой.
Во-первых, мне удалось успешно вызвать хранимую процедуру из базы данных с помощью:
IList <XXXViewModel> 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, error:
Нет сопоставления с типом объекта System.Collections.Generic.List`1 [[System.Data.SqlClient.SqlParameter, System.Data, Version = 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();
У кого-нибудь есть идеи?
Ответы
Ответ 1
Вам необходимо передать каждый параметр в метод (т.е. вы не можете передать список)
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>("spXXX @param1, @param2",
new SqlParameter("param1", param1Value),
new SqlParameter("param2", param2Value)).ToList();
Ответ 2
Если кто-то еще сталкивается с этим...
Я создал параметры в виде списка, а затем в вызове 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();
Ответ 3
Решение этой проблемы (в моем случае было)
var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms);
Где запрос был строкой, в которую были вставлены параметры, такие как @Name и т.д.
Параметр parms был списком SQLParameters. SQL не любит общие списки....
SQL должен иметь массив SQLParameters, отправленный как и объект [], а не список общего типа.
var stuff = db.Database.SqlQuery<SomeEntityType>(query, parms.ToArray());
Ответ 4
В моем случае параметр 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/no-mapping-exists-from-object-type.html
Ответ 5
Вы также можете использовать string.Format для передачи параметров хранимой процедуре
string command = string.Format("EXEC spXXX {0},{1}", param1Value, param2Value);
IList<XXXViewModel> XXXList =
_context.Database.SqlQuery<XXXViewModel>(command).ToList();