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

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

我的class级:

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(); } 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 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实例已被处理,不能再用于需要连接的操作。

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

如果你帮助我会很高兴。

您可以强烈键入包含,这将为您提供有关您的对象结构是否正确相关的提示。 这解决了任何“魔术字符串”问题,例如在包含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(); 

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

PersonIndexVM() ,我创建了People = new List(); Person类由entity framework创建。 它与数据库有关。 当我在GetPeople()方法中创建一个PersonIndexVM()对象的model并将此model对象作为json返回时,模型对象尝试在连接关闭后到达User类信息。 而且我收到了这个错误。 要解决这个问题:

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

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

当您使用关键字Using时,问题就在于。

看看这个如何解决错误的ObjectContext

在我的情况下,我将所有模型’用户’传递给一个列,它没有正确映射,所以我只是传递’Users.Name’并修复它。!!

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