2010-04-02 4 views
7

Talvolta durante l'esecuzione ottengo l'errore sopra riportato. L'eccezione proviene da ASP.NET SqlDataReader ogni volta che si tenta di leggere i dati prima di chiamare il metodo Read(). Dal momento che EF fa tutto questo internamente, mi chiedo che altro possa causare questo errore. potrebbe essere la connettività di rete (o) db?'Tentativo non valido di leggere quando nessun dato è presente' - l'eccezione si verifica "a volte" in Entity Framework

grazie

aggiuntive Bounty Info (GenericTypeTea):

ho ottenuto lo stesso errore dopo l'aggiornamento a codice EF First RC (4.1):

"Tentativo non valido di leggere quando nessun dato è "

Questo è il codice in questione:

using (var context = GetContext()) 
{ 
    var query = from item in context.Preferences 
       where item.UserName == userName 
       where item.PrefName == "TreeState" 
       select item; 

    // Error on this line 
    Preference entity = query.FirstOrDefault(); 
    return entity == null ? null : entity.Value; 
} 

La struttura della tabella è la seguente:

Preference 
{ 
    Username [varchar(50)] 
    PrefName [varchar(50)] 
    Value [varchar(max)] Nullable 
} 

Il tavolo è autonoma e non ha rapporti. Questo è il codice DbModelBuilder:

private void ConfigurePreference(DbModelBuilder builder) 
{ 
    builder.Entity<Preference>().HasKey(x => new { x.UserName, x.PrefName }); 
    builder.Entity<Preference>().ToTable("RP_Preference"); 
} 

Esattamente lo stesso codice funziona perfettamente in CTP5. Sto indovinando che questo è un bug RC, ma qualsiasi idea su come risolverlo sarebbe apprezzata.

+0

@Carnotaurus - Perché è interessato alla stringa "Valore". – anon

+0

Perché "return entity" non è uguale a "return entity.value" ... –

+0

@Ladislav - Nessuna necessità di name-calling. Il mio fondamento logico era che (proprio come i CTP), sarebbe utile avere tag per ciascuna versione prima della versione finale, nel caso ci fossero correzioni di bug o modifiche API. Ma rimanderò alla tua saggezza come membro onesto di SO. – anon

risposta

0

Stai riutilizzando i contesti? Immagino che questo stia accadendo a causa di qualcosa che stai facendo all'interno di GetContext

Se GetContext() fornisce un contesto vecchio, in cui il DataReader è chiuso/danneggiato, ho potuto vedere succedere sopra.

0

Non riesco a riprodurre il problema su EF4.1 RC1.

POCO:

public class Preference 
{ 
    public string UserName { get; set; } 
    public string PrefName { get; set; } 
    public string Value { get; set; } 
} 

Contesto:

public class PreferenceContext : DbContext 
{ 
    public DbSet<Preference> Preferences {get;set;} 

    public PreferenceContext() 
    : base("Data Source=localhost;Initial Catalog=_so_question_ef41_rc;Integrated Security=SSPI;") { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     ConfigurePreference(modelBuilder); 
     base.OnModelCreating(modelBuilder); 
    } 

    private void ConfigurePreference(DbModelBuilder builder) 
    { 
     builder.Entity<Preference>().HasKey(x => new { x.UserName, x.PrefName }); 
     builder.Entity<Preference>().ToTable("RP_Preference"); 
    } 
} 

La mia piccola console di App:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string userName = "Anon"; 
     for (int i = 0; i < 10000; i++) 
     { 
      var p = GetPreference(userName);     
     } 
    } 

    private static string GetPreference(string userName) 
    { 
     using (var context = new PreferenceContext()) 
     { 
      var query = from item in context.Preferences 
          where item.UserName == userName 
          where item.PrefName == "TreeState" 
          select item; 

      // Error on this line 
      Preference entity = query.FirstOrDefault(); 
      return entity == null ? null : entity.Value; 
     } 
    } 
} 

Io 10.000 recita, e nessun errore. Dovrai pubblicare un codice più completo per continuare.

+0

... Forse succede qualcosa di sbagliato nel metodo GetContext(). Iniziamo da lì. – anon

+0

Non c'è niente di sbagliato in GetContext(). Restituisce solo 'new Context (connectionString);' Succede solo quando il valore contiene una grande quantità di dati. Circa 10K +. – GenericTypeTea

1

Questo errore si verifica quando è presente una grande quantità di dati nella versione RC. La differenza tra RC e CTP5 è che è necessario specificare la proprietà [MaxLength] che contiene una grande quantità di dati.

+0

Dove e come si specifica MaxLength? – BlueChippy

0

Aumentare il CommandTimeout nel contesto.

0

Ho avuto lo stesso problema con EF4 - Nel mio caso ero (cercando di) restituire l'elenco delle entità all'interno della sezione {}.Questo è lo stesso che si sta facendo nella tua domanda:

return entity == null ? null : entity.Value; 

} // end utilizzando

mi sono trasferito il ritorno dopo il} e ha funzionato.

Penso di aver avuto il problema, perché il codice è stato in una funzione che ha avuto già interrogato il database in un altro blocco utilizzando, ho il sospetto che la tavola stava chiudendo, ma non riporta l'errore, che termina il blocco utilizzando prima del ritorno rilasciato il blocco del database.

Steve

Problemi correlati