2011-03-15 19 views
7

Estoy utilizando Entity Framework (v4.0) para conectarme a SQL Azure (tengo el SDK de marzo instalado) y obtengo un InvalidOperationException al intentar consultar una tabla. El mensaje de la excepción es Invalid attempt to read when no data is present. y el seguimiento de la pila muestra claramente que este está fallando internamente en EF cuando se intenta obtener la cabecera de la columna:Entity Framework "Intento no válido de lectura cuando no hay datos" con datos 'grandes' en Azure

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) 

Esto está específicamente relacionado con los datos de una columna en la segunda tabla (Configuraciones en el ejemplo a continuación). Esto funciona perfectamente bien si consulto otra tabla (como los Usuarios en el siguiente ejemplo) o excluyo la búsqueda de esa columna. Ejemplo de código:

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

He intentado volver a crear las tablas, el cambio de nombres de tablas, nombres de columnas y tipos de datos y ninguna de ayuda. Si la tabla está vacía o la columna contiene un conjunto 'pequeño' de datos, entonces funciona, pero en el momento en que tengo una sola fila con datos 'grandes', ¡falla!

¿Qué quiero decir por pequeña & grande, así que en realidad no Smal & grande para SQL:

  • 'pequeño' < ~ 8k
  • 'grande'> ~ 8k

Puedo confirmar que el problema no está relacionado con mí disposing the context temprano.


Actualizaciones

  1. Este es sólo de lectura, inserciones funcionan bien.
  2. Esto no ocurre cuando uso LINQ to SQL, solo con EF.
  3. Bug logged with Microsoft ya que sospecho que esto no es un comportamiento normal.
+0

obtengo un error similar. alguna solución a esto? –

Respuesta

1

Aumente CommandTimeout en el contexto.

1

Aumenté el tiempo de espera del comando, y funcionó.

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(); 
    } 
} 
} 
Cuestiones relacionadas