5

リストボックスがあり、このリストボックスから ListofKBrands1 という名前の項目を選択すると、次のエラー メッセージが表示されます。

ObjectContext インスタンスは破棄されており、接続を必要とする操作には使用できなくなりました。

コード ビハインドでは、このエラーの代わりに:

if (co.Company != null)

私のコード:

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

エラー前:

ここに画像の説明を入力

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

選択した KBrand の会社が null の場合、このエラーは表示されません。しかし、選択した KBrand の会社が null でない場合、このエラーが発生します。このエラーを修正するにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

19

Companyあなたの場合、遅延ロードする必要があります。しかし、エンティティは切り離された状態になりました (KBrandエンティティをロードしたコンテキストは破棄されました。そのため、プロパティにアクセスしようとするCompanyと、Entity Framework は破棄されたコンテキストを使用してサーバーにクエリを実行しようとします。これにより、例外が発生します。

遅延読み込みKBrandを有効にするには、エンティティを現在のコンテキストにアタッチする必要があります

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

または、すでにロードされているように、eager loadingを使用する必要があります。Companyアイテム入手時はこんな感じ。

RSPDbContext db = new RSPDbContext();
var brands = db.KBrands.Include(b => b.Company).ToList();
// assign brands to listbox
于 2013-07-17T07:00:26.190 に答える