7

我在阅读过程中有时会收到上述错误。每当您在调用 Read() 方法之前尝试读取数据时,该异常就源自 ASP.NET SqlDataReader。由于 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 错误,但任何关于如何修复它的想法都将不胜感激。

4

5 回答 5

1

当 RC 版本中有大量数据时会出现此错误。RC 和 CTP5 的区别在于需要指定[MaxLength]包含大量数据的属性。

于 2011-03-27T12:06:04.793 回答
0

我无法在 EF4.1 RC1 上重现您的问题。

POCO:

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 次读取,没有错误。您需要发布更完整的代码才能继续。

于 2011-03-26T19:48:16.163 回答
0

你在重用上下文吗?我猜这是因为你正在做的事情GetContext

如果GetContext()提供了一个过时的上下文,其中 DataReader 已关闭/损坏,我可以看到上述情况发生。

于 2011-03-26T16:15:02.950 回答
0

增加上下文的 CommandTimeout。

于 2012-02-09T10:44:09.490 回答
0

我在使用 EF4 时遇到了同样的问题 - 在我的情况下,我(试图)返回 using{} 部分中的实体列表。这与您在问题中所做的相同:

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

} // 结束使用

我将返回移到 } 之后,它起作用了。

我认为我遇到了问题,因为代码在一个已经在另一个 using 块中查询数据库的函数中,我怀疑表被锁定但没有报告错误,在返回释放数据库锁之前结束 using 块。

史蒂夫

于 2012-05-28T11:01:19.927 回答