c# - ObjectContext实例已被处理,不能再用于需要连接的操作

本文关键字:用于 连接 操作 不能 ObjectContext 实例 处理 | 更新日期: 2023-09-27 18:03:43

很抱歉重复。我正朝着同样的问题前进,但仍然无法处理它。我使用Angularjs框架和Asp.net mvc。

我的person类:

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 => b.UserID == UserID).ToList();仍然得到相同的错误。

如果你能帮助我,那将是我的荣幸。

c# - ObjectContext实例已被处理,不能再用于需要连接的操作

问题解决了。我从朋友那里得到帮助。它是关于不封闭的连接。是我的错。我没提过。

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

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

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

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

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

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

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

看起来问题是当你使用关键字使用

看这个如何解决错误的ObjectContext

在我的情况下,我将所有模型'用户'传递到一列,它没有正确映射,所以我只是传递'用户。命名,它修复了它!!

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();

在我的情况下,我在前端有一个bug,导致后端相同的函数被触发3次,导致线程问题。