ObjectContext 实例已被释放,不能再用于需要连接的操作 [英] The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

查看:25
本文介绍了ObjectContext 实例已被释放,不能再用于需要连接的操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个观点:

@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屋!

查看全文
相关文章
C#/.NET最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆