«Недопустимая попытка чтения при отсутствии данных» - исключение происходит «иногда» в Entity Framework - PullRequest
7 голосов
/ 02 апреля 2010

Я иногда получаю вышеуказанную ошибку во время чтения. Исключение возникает из ASP.NET SqlDataReader при каждой попытке чтения данных перед вызовом метода Read (). Поскольку EF делает все это внутренне, мне интересно, что еще может вызвать эту ошибку. это может быть подключение к сети (или) БД?

спасибо

Дополнительная информация о вознаграждении (GenericTypeTea):

У меня такая же ошибка после обновления до EF Code First RC (4.1):

"Недопустимая попытка чтения при отсутствии данных присутствует "

Это код вопроса:

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

Структура таблицы следующая:

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

Таблица автономна и не имеет отношений. Это код DbModelBuilder:

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

Точно такой же код прекрасно работает в CTP5. Я предполагаю, что это ошибка RC, но любые идеи о том, как ее исправить, будут оценены.

Ответы [ 5 ]

1 голос
/ 27 марта 2011

Эта ошибка возникает, когда в версии RC имеется большой объем данных. Разница между RC и CTP5 заключается в том, что вам нужно указать свойство [MaxLength], которое содержит большой объем данных.

0 голосов
/ 28 мая 2012

У меня была такая же проблема с EF4 - в моем случае я (пытался) вернуть список сущностей в разделе using {}. Это то же самое, что вы делаете в своем вопросе:

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

} // конец использования

Я перенес возврат в после}, и это сработало.

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

Steve

0 голосов
/ 09 февраля 2012

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

0 голосов
/ 26 марта 2011

Я не могу воспроизвести вашу проблему на EF4.1 RC1.

ПОКО:

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

Контекст:

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

Моё маленькое консольное приложение:

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

Я делаю 10 000 операций чтения, и никаких ошибок. Вам нужно будет опубликовать более полный код, чтобы продолжить.

0 голосов
/ 26 марта 2011

Вы повторно используете контексты?Я полагаю, что это происходит в результате того, что вы делаете в GetContext

Если GetContext() предоставляет устаревший контекст, в котором DataReader закрыт / поврежден, я мог видеть, как это происходило выше.

...