Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ObjectContext实例已被释放,不能再用于需要连接的操作_C#_.net_Asp.net Mvc 3_Entity Framework_Exception Handling - Fatal编程技术网

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;