2013-07-17 16 views
5

bir bağlantısı gerektiren işlemler için kullanılabilir:hatası: ObjectContext örneği tanzim edilmiş ve artık ben bir liste vardır ve ben ListofKBrands1 olarak adlandırılan bu liste bir öğeyi seçtiğinizde, ben bu hata mesajını almaya

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

arka plan kod olarak

, bu hatanın yeri:

if (co.Company != null) 

kodum:

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; 
     } 
    } 
hata öncesi:

enter image description here

benim KBrand.cs:

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

seçilen KBrand şirket boşsa, bu hata görünmüyor. ancak seçilen KBrand'ın şirketi boş değilse, bu hatayı alıyorum. Bu hatayı düzeltebilir miyim? şimdiden teşekkürler. Durumunuzda tembel yüklü olması gerekir.

cevap

19

1 Eğer Company özelliği erişmeye çalışırken Ama şimdi tanzim KBrand varlık yüklenen müstakil devlet (bağlamda şimdi varlık. Yani, Varlık Çerçeve sunucusuna sorgu yaratmaya kendini hazır bağlamı kullanmaya çalışır. Bu sana istisna verir.

Sen lazy-loading

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

etkinleştirmek için mevcut bağlamda için KBrand varlığı tutturmak gerekir VEYA zaten yüklü Company olması, eager loading kullanmak gerekir bir şey bu öğeleri alırken:.

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

@rockenpeace çok teşekkür ederim –

+0

her iki seçenek için kod eklendi .. ilk öneriyi denedim ve işe yarıyordu. İstekli yükleme konusunda ikincisini denedim ama b tanınmadı. – rockenpeace

+0

@rockenpeace 'System.Data.Entity.DbExtensions' ad alanında tanımlanan genel yöntem. Ayrıca, Include ("Company") 'i kullanabilirsiniz –

1

sadece Sergey'in noktasına eklemek için , Bunun yerine

,

RSPDbContext db = new RSPDbContext(); 
var brands = db.KBrands.Include(b => b.Company).ToList(); 
// assign brands to listbox 
Bu benim için çalıştı

..

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

yazılan lambda çok daha iyi sabit kodlanmış sabit – devi

+3

System.Data.Entity kullanarak ekleyin; lambda ifadesinin çalışması –

+0

'Include' hiç yardım etmiyorsa ne yapmalıyım? Bu problemle başarıya ulaşamıyorum ... – Azimuth

İlgili konular