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

时间:2015-07-21 14:17:12

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

我很抱歉重复。我使用相同的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方法中从数据库中获取了正确的对象。但在那之后我收到了这个错误:

  

&#39; ObjectContext实例已被处理,不能再用于需要连接的操作。&#39;

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

如果你帮助我会很高兴。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

当您使用关键字使用时,问题就出现了。

看看这个How to solve the error The ObjectContext

答案 3 :(得分:0)

就我而言,我正在传递所有模特&#39;用户&#39;到列,它没有正确映射,所以我只是通过&#39; Users.Name&#39;它修好了。!!

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

答案 4 :(得分:0)

在我的情况下,我在前端有一个错误,该错误导致后端中的同一功能被触发3次,从而导致线程问题。 也许也可以考虑这样做。