这个问题在这里已有答案:
我有这个观点:
@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实例已被释放,不能再用于需要连接的操作 .
我无法弄清楚为什么 .
6 回答
一个不好的做法,但你可以设置
在
Context
的constructor
您的 using 子句在 View 有机会使用它之前处理(读取:销毁)MatchGamingEntities数据库上下文 . 因此,虽然您可以在将用户传递给_254164之前(或作为)枚举项目,但更好的方法是 using 子句的 drop your use 并让自然垃圾收集在您真正完成之后完成其工作 - 赢得了'直到View完成之后 .
有关更多信息,请参阅this question on the Entity Framework and Connection Pooling .
问题是这一行:
对枚举进行了延迟评估,并且由于您的MatchGamingEntities在视图循环遍历枚举之前被处理掉,因此代码在尝试执行此操作时会死亡 .
您将要么必须找到一种方法来管理 db 对象的生命周期,使其超出控制器方法,或者在将所有数据传递到视图之前将所有数据放入内存中的Model对象 .
请参阅here以获得类似的解释 .
问题是,当您执行以下操作时,您将发出浅拷贝:
您需要做的是创建UsersCopy,然后遍历用户将值复制到UsersCopy,然后返回UsersCopy以执行深层复制
就像是
我猜测问题是你的LINQ查询的执行被推迟到开始在你的视图上访问它们 . 此时
db
已经处理完毕 .试试这个:
添加了ToList()
这将在处置
db
之前强制从DB中获取 .如果您在显示子属性(即行项目)时遇到问题 . 这是对我有用的脏修复 . 修复了我没有检索对象的子项的问题:
header.MachineDataLines = header.MachineDataLines;