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

公司.cs:

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

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

如果所选 KBrand 的公司为空,则不会出现此错误。但如果所选 KBrand 的公司不为空,我会出现此错误。我该如何解决此错误?提前致谢。

4

2 回答 2

19

Company在您的情况下应该延迟加载。但是您的实体现在处于分离状态(加载的KBrand实体现在已处置的上下文。因此,当您尝试访问Company属性时,实体框架会尝试使用已处置的上下文对服务器进行查询。这给了您例外。

您需要将KBrand实体附加到当前上下文以启用延迟加载

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

或者你需要使用eager loadingCompany已经加载。当你得到物品时是这样的:

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

补充一下谢尔盖的观点,

取而代之的是,

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

这对我有用..

RSPDbContext db = new RSPDbContext();
var brands = db.KBrands.Include("Company").ToList();
// assign brands to listbox
于 2014-01-02T05:47:46.263 回答