ObjectContext实例已经处理完毕,不能再用于需要连接的操作了

我有这样的看法:

@model MatchGaming.Models.ProfileQuery @{ ViewBag.Title = "Index"; } <h2>Index</h2> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> @using (Html.BeginForm("Results", "Profiles")) { @Html.ValidationSummary(true) <fieldset> <legend>ProfileQuery</legend> @Html.EditorFor(model=>model.SearchString) <p> <input type="submit" value="Create" /> </p> </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div> 

我有这个控制器的HttpPost:

 [HttpPost] public ActionResult Results(ProfileQuery profileQuery) { Debug.Write(profileQuery.SearchString); using(var db = new MatchGamingEntities()) { var SearchUserName = db.Users.SingleOrDefault(a=> a.UserName.Contains(profileQuery.SearchString)); var Users = from m in db.Users join m2 in db.MyProfiles on m.UserId equals m2.UserId where m.UserName == SearchUserName.UserName select new UserViewModel { UserName = m.UserName, LastActivityDate = m.LastActivityDate, Address = m2.Address, City = m2.City, State = m2.State, Zip = m2.Zip }; return View(Users.AsEnumerable()); } } 

这里是对结果的看法:

 @model IEnumerable<MatchGaming.Models.UserViewModel> @{ ViewBag.Title = "Results"; } <h2>Results</h2> <fieldset> <legend>UserViewModel</legend> @foreach (var item in Model){ <div class="display-label">UserName</div> <div class="display-field">@item.UserName</div> <div class="display-label">LastActivityDate</div> <div class="display-field">@String.Format("{0:g}", item.LastActivityDate)</div> <div class="display-label">Address</div> <div class="display-field">@item.Address</div> <div class="display-label">City</div> <div class="display-field">@item.City</div> <div class="display-label">State</div> <div class="display-field">@item.State</div> <div class="display-label">Zip</div> <div class="display-field">@item.Zip</div> } </fieldset> 

我不断收到这个错误:

ObjectContext实例已经被处置,不能再被用于需要连接的操作。

我无法弄清楚为什么。

我猜测,问题是,你的LINQ查询的执行被推迟到开始在你的视图上访问它们。 此时db已经被处理了。

尝试这个:

 return View(Users.ToList()); 

添加ToList()

这将强制从数据库中提取db之前。

View有机会使用它之前,您的使用子句正在处理(读取:销毁) MatchGamingEntities数据库上下文。 因此,尽pipe可以在将用户传递给视图之前(或之后)枚举项目,但更好的方法是放弃使用 using子句,并让自然垃圾收集在您真正完成后执行其工作 – 这将不会在视图完成之后。

有关更多信息,请参阅entity framework和连接池上的这个问题 。

问题是这一行:

 return View(Users.AsEnumerable()); 

枚举是懒惰的评估,因为您的MatchGamingEntities处理之前,您的观点可以循环枚举,代码就会死,当它试图做到这一点。

你要么必须find一种方式来pipe理你的db对象的生命周期,使它超出控制器的方法,或者在把所有的数据传递给视图之前把它们放到内存中的Model对象中。

在这里看到一个类似的解释。

不好的做法,但你可以设置

 this.ContextOptions.LazyLoadingEnabled = false; 

Contextconstructor

问题是,当您执行以下操作时,您正在发出浅拷贝:

  var Users = from m in db.Users join m2 in db.MyProfiles on m.UserId equals m2.UserId where m.UserName == SearchUserName.UserName select new UserViewModel { UserName = m.UserName, LastActivityDate = m.LastActivityDate, Address = m2.Address, City = m2.City, State = m2.State, Zip = m2.Zip }; 

你需要做的是制作一个UsersCopy,然后通过用户将值复制到UsersCopy,然后返回UsersCopy来执行Deep Copy

就像是

 List<User> UsersCopy = new List<User>(); foreach(user in Users){ User u = new User(); u.UserName = user.UserName; u.Address = user.Address; //... UsersCopy.Add(u); } return View(UsersCopy); 

如果你有问题显示子项目,即行项目。 这是为我工作的肮脏的修复程序。 解决了我没有检索对象的子项的问题:

header.MachineDataLines = header.MachineDataLines;