ObjectContext 实例已被释放,不能再用于需要连接的操作 [英] The ObjectContext instance has been disposed and can no longer be used for operations that require a connection
问题描述
我有这个观点:
@model MatchGaming.Models.ProfileQuery@{ViewBag.Title = "索引";}<h2>索引</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)<字段集><legend>ProfileQuery</legend>@Html.EditorFor(model=>model.SearchString)<p><输入类型=提交"值=创建"/></p></fieldset>}<div>@Html.ActionLink("返回列表", "索引")
我有这个用于 HttpPost 的控制器:
[HttpPost]公共操作结果结果(ProfileQuery profileQuery){Debug.Write(profileQuery.SearchString);使用(var db = new MatchGamingEntities()){var SearchUserName = db.Users.SingleOrDefault(a=>a.UserName.Contains(profileQuery.SearchString));var Users = from m in db.Users在 m.UserId 上的 db.MyProfiles 中加入 m2 等于 m2.UserId其中 m.UserName == SearchUserName.UserName选择新的 UserViewModel{用户名 = m.用户名,LastActivityDate = m.LastActivityDate,地址 = m2.Address,城市 = m2.City,状态 = m2.State,邮编 = m2.Zip};返回视图(Users.AsEnumerable());}}
这是结果视图:
@model IEnumerable@{ViewBag.Title = "结果";}<h2>结果</h2><字段集><legend>UserViewModel</legend>@foreach(模型中的变量项目){<div class="display-label">用户名</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 class="display-label">地址</div><div class="display-field">@item.Address</div><div class="display-label">城市</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
已经被处理掉了.
试试这个:
返回视图(Users.ToList());
添加到列表()
这将在处理 db
之前强制从数据库中获取.
I have this view:
@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>
I have this controller for the 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());
}
}
Here is the View for Results:
@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>
I keep getting this error:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
I can't figure out why.
I am guessing that the problem is that the execution of your LINQ query has been deferred until starting to access them on your view. At this point db
has already been disposed.
Try this:
return View(Users.ToList());
Added ToList()
That will force the fetch from the DB before disposing db
.
这篇关于ObjectContext 实例已被释放,不能再用于需要连接的操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!