2010-04-02 5 views
7

Otrzymuję powyższy błąd czasami podczas odczytu. Wyjątek pochodzi z programu ASP.NET SqlDataReader za każdym razem, gdy próbuje się odczytać dane przed wywołaniem metody Read(). Ponieważ EF robi wszystko wewnętrznie, zastanawiam się, co jeszcze może spowodować ten błąd. czy może to być sieć (lub) połączenie db?"Nieprawidłowa próba odczytania, gdy brak danych" - wyjątek się dzieje "czasami" w Entity Framework

dzięki

dodatkowe Bounty Info (GenericTypeTea):

Mam ten sam błąd po aktualizacji do EF Code First RC (4.1):

„Nieprawidłowa próba odczytać, gdy nie ma danych "

To jest kod w pytaniu:

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

Struktura tabeli jest następująca:

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

Stół jest samodzielna i nie ma żadnych relacji. To jest kod DbModelBuilder:

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

Dokładnie ten sam kod działa doskonale w CTP5. Zgaduję, że jest to błąd RC, ale wszelkie pomysły, jak to naprawić, byłyby mile widziane.

+0

@Carnotaurus - Ponieważ interesuje go ciąg "Wartość". – anon

+0

Ponieważ "jednostka zwrotu" nie jest tym samym, co "return entity.value" ... –

+0

@Ladislav - Nie ma potrzeby wywoływania imienia. Myślałem, że (podobnie jak CTP) warto mieć tagi dla każdej wersji przed ostatecznym wydaniem, na wypadek gdyby pojawiły się poprawki lub zmiany API. Ale odradzam twoją mądrość jako szanujący się członek SO. – anon

Odpowiedz

0

Czy ponownie używasz kontekstów? Przypuszczam, że dzieje się tak w wyniku działania, które robisz w ramach jednego obiektu: GetContext

Jeśli GetContext() zapewnia nieaktualny kontekst, w którym obiekt DataReader jest zamknięty/uszkodzony, mogłem zobaczyć powyższe działania.

0

Nie mogę odtworzyć twojego problemu na EF4.1 RC1.

POCO:

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

Kontekst:

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

Mój mały App konsoli:

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

Mam 10000 czyta, a nie błąd. Aby kontynuować, musisz opublikować bardziej kompletny kod.

+0

... Może dzieje się coś złego w twojej metodzie GetContext(). Zacznijmy tam. – anon

+0

Nic złego w GetContext(). Po prostu zwraca 'nowy kontekst (connectionString);' Dzieje się tak tylko wtedy, gdy wartość zawiera dużą ilość danych. Około 10 KB +. – GenericTypeTea

1

Ten błąd występuje, gdy w wydaniu RC znajduje się duża ilość danych. Różnica między RC i CTP5 polega na określeniu właściwości [MaxLength] zawierającej dużą ilość danych.

+0

Gdzie i jak określić MaxLength? – BlueChippy

0

Zwiększyć wartość parametru CommandTimeout w kontekście.

0

Miałem ten sam problem z EF4 - W moim przypadku (próbowałem) zwróciłem listę podmiotów w sekcji {} używając {}.To jest taki sam jak robisz w swoim pytaniu:

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

} // koniec użyciu

przeniosłem się na powrót do po} i to działało.

Chyba miałem problemu, ponieważ kod jest w funkcję, która miała już kwerendy bazy danych w innym wykorzystaniem bloku, podejrzewam, stół był blokowania ale nie zgłoszenie błędu, kończąc przy użyciu bloku przed powrotem wydany blokada bazy danych.

Steve

Powiązane problemy