2010-04-02 33 views
7

Tôi gặp lỗi trên đôi khi trong khi đọc. Ngoại lệ bắt nguồn từ ASP.NET SqlDataReader bất cứ khi nào bạn cố đọc dữ liệu trước khi gọi phương thức Read(). Vì EF thực hiện tất cả các nội bộ này, tôi tự hỏi điều gì khác có thể gây ra lỗi này. nó có thể là kết nối mạng (hoặc) db không?'Cố gắng không hợp lệ để đọc khi không có dữ liệu' - ngoại lệ xảy ra "đôi khi" trong Entity Framework

nhờ

bổ sung Bounty Thông tin (GenericTypeTea):

Tôi đã có những lỗi tương tự sau khi nâng cấp lên EF Mã Đầu RC (4.1):

"nỗ lực không hợp lệ để đọc khi không có dữ liệu có mặt "

Đây là mã trong câu hỏi:

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

Cấu trúc bảng như sau:

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

Bảng này là độc lập và không có mối quan hệ. Đây là mã DbModelBuilder:

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

Chính xác cùng một mã hoạt động hoàn hảo trong CTP5. Tôi đoán đây là một lỗi RC, nhưng bất kỳ ý tưởng nào về cách khắc phục nó sẽ được đánh giá cao.

+0

@Carnotaurus - Vì anh ấy quan tâm đến chuỗi "Giá trị". – anon

+0

Vì "thực thể trả lại" không giống như "return entity.value" ... –

+0

@Ladislav - Không cần phải gọi tên. Lý do của tôi là (giống như của CTP), sẽ có giá trị khi có thẻ cho mỗi phiên bản trước khi phát hành cuối cùng, trong trường hợp có sửa lỗi hoặc thay đổi API. Nhưng tôi sẽ trì hoãn sự khôn ngoan của bạn như là một thành viên của SO. – anon

Trả lời

0

Bạn có đang sử dụng lại các ngữ cảnh không? Tôi cho rằng điều này đang xảy ra do kết quả của việc bạn đang thực hiện trong phạm vi GetContext

Nếu GetContext() cung cấp ngữ cảnh cũ, trong đó DataReader bị đóng/hỏng, tôi có thể thấy điều trên xảy ra.

0

Tôi không thể tái tạo sự cố của bạn trên EF4.1 RC1.

POCO:

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

Bối cảnh:

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

chút Bảng điều khiển ứng dụng của tôi:

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

Tôi 10,000 lần đọc, và không có lỗi. Bạn sẽ cần đăng thêm mã hoàn chỉnh để tiếp tục.

+0

... Có thể có điều gì đó sai xảy ra trong phương thức GetContext() của bạn. Hãy bắt đầu ở đó. – anon

+0

Không có gì sai với GetContext(). Nó chỉ trả về 'Ngữ cảnh mới (connectionString);' Nó chỉ xảy ra khi giá trị chứa một lượng lớn dữ liệu. Khoảng 10K +. – GenericTypeTea

1

Lỗi này xảy ra khi có một lượng lớn dữ liệu trong bản phát hành RC. Sự khác biệt giữa RC và CTP5 là bạn cần chỉ định thuộc tính [MaxLength] chứa một lượng lớn dữ liệu.

+0

Tôi làm cách nào để chỉ định MaxLength? – BlueChippy

0

Tăng CommandTimeout trong ngữ cảnh.

0

Tôi đã gặp vấn đề tương tự với EF4 - Trong trường hợp của tôi, tôi (cố gắng) trả về danh sách các thực thể trong phần {} sử dụng.Đây là giống như bạn đang làm trong câu hỏi của bạn:

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

} // end sử dụng

tôi chuyển sự trở lại để sau} và nó làm việc.

Tôi nghĩ rằng tôi gặp sự cố vì mã nằm trong một hàm có đã truy vấn cơ sở dữ liệu trong một khối khác, tôi nghi ngờ bảng đã khóa nhưng không báo cáo lỗi, kết thúc khối sử dụng trước khi trả lại khóa cơ sở dữ liệu.

Steve

Các vấn đề liên quan