Исключение индекса вне диапазона в FieldNameLookup.GetOrdinal при запуске SqlQuery EF - PullRequest
0 голосов
/ 02 июля 2018

В конечном итоге мы получаем исключение IndexOutOfRange при выполнении кода, подобного этому:

result.Data = dbOptima.Database.ExecuteStoredProcedure(
    task,
    StoredProcedureValues.PROC_GET_TASKS).ToList();

, где ExecuteStoredProcedure выполняет следующие действия:

public static IEnumerable<TResult> ExecuteStoredProcedure<TResult>(this Database database, IStoredProcedure<TResult> procedure, string procedureName)
{
    var parameters = CreateSqlParametersFromProperties(procedure);
    var format = CreateSPCommand<TResult>(parameters, procedureName);

    return database.SqlQuery<TResult>(format, parameters.Cast<object>).ToArray());
}

Мы не можем воспроизвести проблему локально, но с помощью Application Insights исключение регистрируется довольно часто. Ниже приводится извлечение стека вызовов:

System.IndexOutOfRangeException:
   at System.Data.ProviderBase.FieldNameLookup.GetOrdinal (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.SqlClient.SqlDataReader.GetOrdinal (System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.TryGetColumnOrdinalFromReader (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.CreateColumnMapFromReaderAndClrType (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Objects.ObjectContext.InternalTranslate (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Objects.ObjectContext+<>c__DisplayClass65`1.<ExecuteStoreQueryReliably>b__64 (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Objects.ObjectContext+<>c__DisplayClass65`1.<ExecuteStoreQueryReliably>b__63 (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute (EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext (EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Collections.Generic.List`1..ctor (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Linq.Enumerable.ToList (System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)

Мы попытались воспроизвести проблему локально:

  • сбой хранимой процедуры.
  • заставить хранимую процедуру вернуть 0 результатов.
  • вызывает проблему сопоставления путем переименования некоторого свойства модели.

безуспешно.

Обычно эта ошибка возникает из-за ошибки сопоставления в считывателе данных при использовании ADO.NET , но это не так, поскольку мы используем EF 6 и это происходит не всегда, поэтому мы не можем найти, где проблема.

1 Ответ

0 голосов
/ 21 ноября 2018

Проблема связана с привязкой результата хранимой процедуры к модели , объявленной связанной с выходом хранимой процедуры.

Если хранимая процедура извлекает больше столбцов, чем свойств, которые имеет модель, даже если модель удовлетворена (поскольку все свойства могут быть сопоставлены со столбцами выходных данных хранимой процедуры), внутренне возникает исключение, поскольку модель не не имеет свойств для хранения некоторых выходных значений процедуры сохранения.

Итак, это можно исправить двумя способами: либо

  • добавление свойств в модель для хранения столбцов хранимых процедура или
  • удаление ненужных столбцов вывода хранимой процедуры.

Второй подход, как правило, лучше, так как эта проблема делает очевидным, что некоторые данные, возвращаемые хранимой процедурой, больше не требуются, поэтому было бы чище и эффективнее удалить ненужный код из хранимой процедуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...