C# ObjectContext实例已被释放,不能再用于需要连接的操作
我有这样的看法:C# ObjectContext实例已被释放,不能再用于需要连接的操作,c#,.net,asp.net-mvc-3,entity-framework,exception-handling,C#,.net,Asp.net Mvc 3,Entity Framework,Exception Handling,我有这样的看法: @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
@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>
以下是结果视图:
@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>
@model IEnumerable
@{
ViewBag.Title=“结果”;
}
结果
用户视图模型
@foreach(模型中的var项目){
用户名
@item.UserName
最后活动日期
@String.Format(“{0:g}”,item.LastActivityDate)
地址
@项目.地址
城市
@项目.城市
陈述
@项目.说明
拉链
@物品。拉链
}
我不断地发现这个错误:
ObjectContext实例已被释放,不能再用于需要连接的操作
我不知道为什么。我猜问题在于LINQ查询的执行被推迟到开始在视图上访问它们时。此时,
db
已被释放
试试这个:
return View(Users.ToList());
增加了ToList()
这将在处理
DB
之前强制从DB获取。问题是这一行:
return View(Users.AsEnumerable());
枚举是惰性计算的,因为在视图循环遍历枚举之前,MatchGamingEntities就被处理掉了,所以当代码尝试这样做时,它就死了
您必须找到一种方法来管理db对象的生存期,使其超越控制器方法,或者在将所有数据传递到视图之前将其放入内存中的模型对象
有关类似的解释,请参阅。问题在于,当您执行以下操作时,您正在发布浅拷贝:
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
};
您需要做的是创建一个UserScope,然后遍历用户将值复制到UserScope,然后返回UserScope以进行深度复制
差不多
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);
List UsersCopy=newlist();
foreach(用户中的用户){
用户u=新用户();
u、 用户名=user.UserName;
u、 地址=用户地址;
//...
添加(u);
}
返回视图(UserScope);
以防显示子属性(即行项目)时出现问题。这是对我有效的肮脏的修正。修复了我无法检索对象的子项的问题:
header.MachineDataLines=header.MachineDataLines 您的使用子句在视图有机会使用MatchGamingEntities db上下文之前,正在处理(读取:销毁)MatchGamingEntities db上下文。因此,虽然您可以在将用户传递到视图之前(或在传递给视图时)枚举项目,但更好的方法是放弃使用using子句,让自然垃圾收集在您真正使用完它之后再执行它的工作,这要等到视图完成之后才能执行
有关详细信息,请参阅。一种不好的做法,但您可以设置
this.ContextOptions.LazyLoadingEnabled = false;
在
上下文的构造函数中,我尝试了这个方法,然后得到了这个错误:“对象引用未设置为对象的实例。”这个错误正好发生在您发布给我要更改的行。这就是扔垃圾的原因exception@anthonypliu,我从示例中删除了不需要的AsEnumerable()
,因为ToList()已经是可枚举的。查看视图代码时,LastActivityDate可能为null,并由于字符串.Format()而导致NullReferenceException。它应该会起作用。否则,请进入代码并找到空引用-很可能是用户对象或视图中的某个对象。我尝试过,但没有成功,我想我知道问题的一部分,我的第一个视图没有正确发布ProfileQuery模型,因为我尝试打印ProfileQuery.SearchString,但我得到了一个空异常,所以SearchString甚至都没有通过httppost。通常情况下,脏补丁是不可取的。而是从源头上解决问题。重点强调“坏”。如果你认为需要这样做,你需要重新考虑你的SOC策略。为了让它不那么坏,请使用上下文语句进行包装,以便在调用命令后销毁设置
this.ContextOptions.LazyLoadingEnabled = false;