2013-07-17 17 views
5

tôi có một ListBox và khi tôi chọn một mục từ hộp danh sách này gọi là ListofKBrands1, tôi mất thông báo lỗi này:lỗi: Ví dụ ObjectContext đã được xử lý và có thể không còn được sử dụng cho các hoạt động yêu cầu kết nối

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

trong code-behind, nơi lỗi này:

if (co.Company != null) 

mã của tôi:

private void ListofKBrands1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     RSPDbContext c = new RSPDbContext(); 

     if (ListofKBrands1.SelectedItem != null) 
     { 
      ListBoxItem item = ListofKBrands1.SelectedItem as ListBoxItem; 
      KBrand co = item.Tag as KBrand; 

      if (ListofKBrands1.SelectedItem != null) 
       txtNewKBrand.Text = co.Name; 
      else 
       txtNewKBrand.Text = ""; 

      int count = 0; 
      if (co.Company != null) 
      { 
       foreach (string a in cbCompany.Items) 
       { 
        if (a == co.Company.Name) 
         cbCompany.SelectedIndex = count; 
        count++; 
       } 
      } 
      else 
       cbCompany.SelectedIndex = 0; 
     } 
    } 

trước khi lỗi:

enter image description here

KBrand.cs tôi:

public class KBrand { 
    [Key] 
    public int Id { get; set; } 
    public String Name { get; set; } 
    public virtual Company Company { get; set; } 

    public override string ToString() { 
     return Name; 
    } 
} 

company.cs:

public class Company 
{ 
    [Key] 
    public int Id { get; set; } 
    public String Name { get; set; } 

    public override string ToString() { 
     return Name; 
    } 
} 

nếu công ty của chọn KBrand là null, lỗi này không xuất hiện. nhưng nếu công ty của KBrand được chọn không phải là null, tôi lấy lỗi này. Làm thế nào tôi có thể sửa lỗi này? cảm ơn trước.

Trả lời

19

Company nên được tải trong trường hợp của bạn. Do đó, khi bạn đang cố gắng truy cập tài sản Company, Entity Framework cố gắng sử dụng bối cảnh đã xử lý để tạo truy vấn cho máy chủ, điều này cho phép bạn ngoại lệ. cần phải đính kèm đơn vị KBrand của bạn để bối cảnh hiện nay để cho phép lazy-loading

RSPDbContext c = new RSPDbContext(); 
KBrand co = item.Tag as KBrand; 
c.KBrands.Attach(co); 
// use co.Company 

HOẶC bạn cần phải sử dụng eager loading, để có Company đã nạp Something như thế này khi bạn nhận được mục:.

RSPDbContext db = new RSPDbContext(); 
var brands = db.KBrands.Include(b => b.Company).ToList(); 
// assign brands to listbox 
+0

@rockenpeace thêm mã cho cả hai lựa chọn –

+0

thank you very much .. Tôi đã thử đề nghị đầu tiên và nó Works.i đã cố gắng thứ hai về tải háo hức nhưng nó đã không được công nhận b. – rockenpeace

+0

@rockenpeace generic method được định nghĩa trong không gian tên 'System.Data.Entity.DbExtensions'. Ngoài ra, bạn có thể sử dụng 'Bao gồm (" Công ty ")' thay vì –

1

Để chỉ cần thêm vào điểm của Sergey,

Thay vì điều này,

RSPDbContext db = new RSPDbContext(); 
var brands = db.KBrands.Include(b => b.Company).ToList(); 
// assign brands to listbox 

này đã làm việc cho tôi ..

RSPDbContext db = new RSPDbContext(); 
var brands = db.KBrands.Include("Company").ToList(); 
// assign brands to listbox 
+7

gõ lambda tốt hơn nhiều sau đó hardcoded liên tục – devi

+3

thêm bằng cách sử dụng System.Data.Entity; cho biểu thức lambda để làm việc –

+0

Tôi nên làm gì nếu 'Bao gồm' không giúp gì cả? Tôi đang đấu tranh với vấn đề này mà không thành công ... – Azimuth

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