【问题标题】:'Cannot access a disposed object' error while saving object保存对象时出现“无法访问已处置的对象”错误
【发布时间】:2015-11-13 10:57:20
【问题描述】:

我在使用 linq2sql 将对象保存到数据库时遇到问题

代码如下:

static DataContext dataContext = new DataContext();    
public static void ConfirmationPaymentOrder(ConfirmPayments data)
    {
        using (dataContext = new DataContext(DBConnection))
        {
            foreach (OrdersConfirm orderConfirm in data.OrdersConfirm)
            {
                var result = SendRequestToConfirm(orderConfirm.Orders, orderConfirm.UserName, orderConfirm.Password);

                dataContext.Orders.InsertOnSubmit(orderConfirm);

                dataContext.SubmitChanges();
            }
        }
    }

错误:

Cannot access a disposed object.
Object name: 'DataContext accessed after Dispose.'.

我该如何解决这个问题?

【问题讨论】:

  • 您的数据上下文显然是一个静态字段,而不是一个局部变量。你是用另一种方法处理它吗?
  • 调用 dataContext.SubmitChanges() 后出现此错误?
  • @JonasH 我在声明数据上下文的地方添加了行。您是否以另一种方法处理它? - 没有
  • 避免静态字段(和自动属性)
  • 去掉静态的dataContext字段,将代码改为using (var dataContext = ...

标签: c# .net linq linq-to-sql


【解决方案1】:

你不应该共享一个连接对象(静态),这会导致这种问题。静态对象应该只被创建。将声明移到方法内。

public static void ConfirmationPaymentOrder(ConfirmPayments data)
{
    using (var dataContext = new DataContext(DBConnection))
    {
        foreach (OrdersConfirm orderConfirm in data.OrdersConfirm)
        {
            var result = SendRequestToConfirm(orderConfirm.Orders, orderConfirm.UserName, orderConfirm.Password);

            dataContext.Orders.InsertOnSubmit(orderConfirm);
        }
        dataContext.SubmitChanges();
    }
}

注意到循环内的 SubmitChanges 做得很好:C. Knight

【讨论】:

    【解决方案2】:

    可能值得将 dataContext.SubmitChanges() 移到 foreach 循环之外。不知道这是否会解决问题,但可能值得一试,因为似乎没有任何理由(在您的示例中)多次调用 SubmitChanges()。

    我还认为您之前没有意外处理过 DBConnection 对象?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2011-03-25
      • 1970-01-01
      相关资源
      最近更新 更多