Entity Framework «Недопустимая попытка чтения при отсутствии данных» с «большими» данными в Azure - PullRequest
7 голосов
/ 15 марта 2011

Я использую Entity Framework (v4.0) для подключения к SQL Azure (у меня установлен March SDK) и получаю InvalidOperationException при попытке запроса таблицы. Сообщение об исключении - Invalid attempt to read when no data is present., и трассировка стека ясно показывает, что это происходит с ошибкой внутри EF, когда он пытается получить заголовок столбца:

at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i) 
at System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i) 
at lambda_method(Closure , Shaper ) 
at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) 
at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext() 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
at Service.LoadSettings() in C:\Service.svc.cs 
at SyncInvokeLoadSettings(Object , Object[] , Object[] ) 
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)

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

using (var db = new DBEntities()) 
{ 
    var users = (from u in db.Users 
                 where u.PK == userid 
                 select u).ToList();

    if (users.Any()) 
    { 
        var selectedUser = users.Single(); 
        if (selectedUser.Password.Equals(passwordHash)) 
        { 
            // ****************************** 
            // * error is on the next line! * 
            // ****************************** 
            var settings = (from s in db.Settings 
                            where s.User == selectedUser.PK 
                            select s).ToList(); 
        } 
    } 
}   

Я пытался воссоздать таблицы, изменить имена таблиц, имена столбцов и типы данных, и ничего из этого не помогло. Если таблица пуста или столбец содержит «небольшой» набор данных, он работает, но в тот момент, когда в нем есть одна строка с «большими» данными, происходит сбой!

Что я имею в виду под маленькими и большими, ну, они не совсем маленькие и большие для SQL:

  • «маленький» <~ 8k </li>
  • «большой»> ~ 8k

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

<ч /> Обновление

  1. Это только для чтения, вставки работают нормально.
  2. Это не происходит, когда я использую LINQ to SQL, только с EF.
  3. Ошибка, зарегистрированная в Microsoft , так как я подозреваю, что это ненормальное поведение.

Ответы [ 2 ]

1 голос
/ 09 сентября 2013

Я увеличил время ожидания команды, и оно сработало.

using (var db = new DBEntities()) 
{ 
//setting the CommandTimeout before the .ToList()
db.CommandTimeout = 120;

var users = (from u in db.Users 
             where u.PK == userid 
             select u).ToList();

if (users.Any()) 
{ 
    var selectedUser = users.Single(); 
    if (selectedUser.Password.Equals(passwordHash)) 
    { 
        // ****************************** 
        // * error is on the next line! * 
        // ****************************** 
        var settings = (from s in db.Settings 
                        where s.User == selectedUser.PK 
                        select s).ToList(); 
    } 
} 
}   
1 голос
/ 09 февраля 2012

Увеличьте значение CommandTimeout для контекста.

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