【问题标题】:error:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection错误:ObjectContext 实例已被释放,不能再用于需要连接的操作
【发布时间】:2013-07-15 14:44:07
【问题描述】:

我有一个列表框,当我从这个列表框中选择一个名为 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 的公司不为空,我会出现此错误。我该如何解决此错误?提前致谢。

【问题讨论】:

    标签: c# wpf entity-framework


    【解决方案1】:

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

    您需要将KBrand 实体附加到当前上下文才能启用lazy-loading

    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
    

    【讨论】:

    • 非常感谢..我已经尝试了第一个建议并且它有效。我已经尝试了第二个关于急切加载但它没有识别 b.
    • @rockenpeace 泛型方法定义在命名空间System.Data.Entity.DbExtensions 中。你也可以改用Include("Company")
    • @rockenpeace 见this。在 EF6 中,您需要使用命名空间 System.Data.Entity,因为 System.Data.Entity.DbExtensions 确实 not 存在。
    【解决方案2】:

    补充一下 Sergey 的观点,

    取而代之的是,

    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
    

    【讨论】:

    • 类型化 lambda 比硬编码常量好得多
    • 使用 System.Data.Entity 添加;使 lambda 表达式工作
    • 如果Include 一点帮助都没有怎么办?我正在努力解决这个问题,但没有成功......
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多