【问题标题】:C# - The ObjectContext instance has been disposed and can no longer be used for operations that require a connectionC# - ObjectContext 实例已被释放,不能再用于需要连接的操作
【发布时间】:2015-07-21 14:17:11
【问题描述】:

我很抱歉重复。我正在使用相同的problem ,但仍然无法处理它。我正在使用 Angularjs 框架和 Asp.net mvc。

我的人物类:

public partial class Person
{
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Telephone { get; set; }
    public string Adress { get; set; }
    public int UserID { get; set; }

    public virtual User User { get; set; }
}

我的用户类:

public partial class User
{
    public User()
    {
        this.People = new HashSet<Person>();
    }

    public int UserID { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string FullName { get; set; }
    public string Email { get; set; }
    public string Gender { get; set; }

    public virtual ICollection<Person> People { get; set; }
}

我的js代码:

 $http.get('/Data/GetPeople', { params: { UserID: "1" } }).success(function (data) {
        $scope.model = data;
    });

我正在尝试从我的数据库中获取记录:

 public ActionResult GetPeople(int UserID)
    {

        using (PersonEntities dc = new PersonEntities())
        {
            var model = new PersonIndexVM();
            model.People = dc.People.Where(b => b.UserID == UserID).ToList();
            //model.People = dc.People.Include("User").ToList();
            return Json(model, JsonRequestBehavior.AllowGet);
        }

    }

正如我在调试中看到的,我在 GetPeople 方法中从数据库中获取了正确的对象。但在那之后我收到了这个错误:

'ObjectContext 实例已被释放,不能再用于需要连接的操作。'

我试图急切地加载:model.People = dc.People.Include("User").Where(b =&gt; b.UserID == UserID).ToList(); 仍然得到同样的错误。

如果你能帮助我,我会很高兴。

【问题讨论】:

    标签: c# asp.net asp.net-mvc angularjs error-handling


    【解决方案1】:

    问题解决了。我得到朋友的帮助。它关于未关闭的连接。我的错。我没提。

    PersonIndexVM() 中,我创建了People = new List&lt;Person&gt;(); Person 类是由实体框架创建的。它与数据库有关。当我在GetPeople() 方法中创建PersonIndexVM() 的对象model 并将此model 对象作为json 返回时,模型对象会在连接关闭后尝试访问用户类信息。我收到了这个错误。解决这个问题:

    1. 关闭延迟加载以防止访问用户信息。 dc.Configuration.LazyLoadingEnabled = false;

    2. 创建另一个与数据库无关的类并将其对象作为 Json 返回。

    【讨论】:

      【解决方案2】:

      您可以强烈键入您的包含,这将为您提供有关您的对象结构是否正确相关的提示。这解决了任何“魔术字符串”问题,例如在包含 DbExtension 之后,您的表在 EF 上下文中被命名为 Users 而不是 User。

      using System.Data.Entity.DbExtension;
      model.People = dc.People.Include(c => c.User).ToList();
      

      但是,如果您使用 ObjectContext 而不是 DbContext,您可能会遇到魔术字符串。也就是说,EF 会将大多数名称“复数”,因此您的表很可能被命名为“用户”。检查表是否以dc.Users 存在,如果存在,请更改您的魔术字符串以匹配。

      model.People = dc.People.Include("Users").ToList();
      

      【讨论】:

      • c =&gt; c.User 部分,我得到 cannot convert lambda expression to type 'string' because it is not a delegate type 错误。
      • 产品版本:6.1.1
      • @bahardvan 请查看更新,尤其是包含DbExtension 命名空间。
      • 我更正了using System.Data.Entity。但不幸的是,问题仍然相同。我都试过了 c => c.User, "Users"
      • @bahardvan 那么必须有其他东西试图包含一个子表。这个电话还有其他代码吗?它到底在哪条线上爆炸?
      【解决方案3】:

      看起来问题出在您使用关键字使用时。

      看看这个How to solve the error The ObjectContext

      【讨论】:

        【解决方案4】:

        在我的例子中,我将所有模型“用户”传递给一个列,但它没有正确映射,所以我只传递了“用户名”并修复了它。!!

        var data = db.ApplicationTranceLogs
        .Include(q=>q.Users).Include(q => q.LookupItems)
        .Select(q => new { Id = q.Id, FormatDate = q.Date.ToString("yyyy/MM/dd"), Users = ***q.Users***, ProcessType = q.ProcessType, CoreProcessId = q.CoreProcessId, Data = q.Data })
        .ToList();
        

        --

        var data = db.ApplicationTranceLogs
        .Include(q=>q.Users).Include(q => q.LookupItems)
        .Select(q => new { Id = q.Id, FormatDate = q.Date.ToString("yyyy/MM/dd"), Users = ***q.Users.Name***, ProcessType = q.ProcessType, CoreProcessId = q.CoreProcessId, Data = q.Data })
        .ToList();
        

        【讨论】:

          【解决方案5】:

          在我的情况下,我在前端有一个错误,导致后端中的相同功能被触发 3 次,从而导致线程问题。 也许也将其视为一种可能性。

          【讨论】:

            猜你喜欢
            • 2012-07-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多