Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# MVC5DropDownList说DbContext被释放了?_C#_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

C# MVC5DropDownList说DbContext被释放了?

C# MVC5DropDownList说DbContext被释放了?,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我想我已经开始了解如何在MVC中使用DDL了,但我想我还没有真正了解它们的正确设置 我有一个DropDownList,我正在从实体框架填充它,并使用一个存储库。我可以通过代码进行调试,并看到ViewModel正在填充值,但一旦我到达视图,我会得到错误“操作无法完成,因为DbContext已被释放”。我想当我到达视图时,DbContext已经不再需要了 我尝试了Html.DropDownList和Html.DropDownListFor的不同组合,每次我都会收到相同的消息。我确信这是一件简单的事情

我想我已经开始了解如何在MVC中使用DDL了,但我想我还没有真正了解它们的正确设置

我有一个DropDownList,我正在从实体框架填充它,并使用一个存储库。我可以通过代码进行调试,并看到ViewModel正在填充值,但一旦我到达视图,我会得到错误
“操作无法完成,因为DbContext已被释放”
。我想当我到达视图时,DbContext已经不再需要了

我尝试了Html.DropDownList和Html.DropDownListFor的不同组合,每次我都会收到相同的消息。我确信这是一件简单的事情,我只是不明白,但我已经看了不同的例子,并尝试了一些不同的组合,没有任何运气

这是我的ViewModel

public class AssignCounselorViewModel
{
    public IEnumerable<SelectListItem> listMerits { get; set; }

    public int MeritSelectedId { get; set; }
}
这是我的存储库:

public static IEnumerable<SelectListItem> GetAllMerits()
{
    using (DataContext ctx = new DataContext())
    {
        var results = (from m in ctx.MeritBadges
                       select new SelectListItem
                       {
                           Value = m.ID.ToString(),
                           Text = m.MeritBadgeName
                        }
                       ).OrderBy(o => o.Text);

        return new SelectList(results, "Value", "Text");
    }
}
试试这个

public static IEnumerable<SelectListItem> GetAllMerits()
{
    using (DataContext ctx = new DataContext())
    {
        var results = (from m in ctx.MeritBadges
                       select new SelectListItem
                       {
                           Value = m.ID.ToString(),
                           Text = m.MeritBadgeName
                       }
                       ).OrderBy(o => o.Text).ToArray(); // .ToArray() => materialize collection. After this data will be returned from database.

        return new SelectList(results, "Value", "Text"); 
    }
}
public静态IEnumerable getAllMerities()
{
使用(DataContext ctx=newdatacontext())
{
var结果=(从ctx.MeritBadges中的m开始)
选择新的SelectListItem
{
Value=m.ID.ToString(),
Text=m.MeritBadgeName
}
).OrderBy(o=>o.Text).ToArray();//.ToArray()=>具体化集合。之后,数据将从数据库返回。
返回新的选择列表(结果、“值”、“文本”);
}
}

详细介绍tym32167的答案,该答案应能解决问题

using (DataContext ctx = new DataContext())
{
    var results = (from m in ctx.MeritBadges
                   select new SelectListItem
                   {
                       Value = m.ID.ToString(),
                       Text = m.MeritBadgeName
                    }
                   ).OrderBy(o => o.Text);

    return new SelectList(results, "Value", "Text");
}
这将返回一个
IQueryable
,这是一个尚未针对数据库执行的查询,但包含发送要执行的命令时要调用的指令。这是在作用域DbContext中返回的,调用完成后将对其进行处理。一旦执行了
IQueryable
,结果将变成某种类型的
IEnumerable
.ToList
变成
列表
.ToArray()
变成数组等),并且
DbContext
被释放

因此,当您两次调用
IQueryable
时,如下所示:

<div class="row">
    <div class="col-md-12">
        @Html.DropDownListFor(m => m.listMerits,
                new SelectList(Model.listMerits, "Text", "Value"))
    </div>
</div>

@Html.DropDownListFor(m=>m.listfor,
新的选择列表(Model.listMatters、“文本”、“值”))
第一个实例
m=>m.listMerties
将执行查询并处理上下文;然后调用
model.listMertives
,它将再次尝试执行
IQueryable
以枚举数据,但上下文已被释放


Edit:tym32167指出我的
IQueryable
类型错误。

已编辑。对不起,我看错了。ToList()也可以。使用.ToArray()和.ToList()之间有什么真正的区别吗?@Caverman只提供您想要的收藏类型。它们都在枚举源集合,因此都将强制从数据库检索数据。我选择数组是因为它是只读的,并且占用的内存少了一点。@tym32167数组不是只读的。@Maarten我的意思是,你不能更改现有数组的长度,但通常你是对的,thx。只需将repo方法清除,它将返回
SelectList
。其他一切正常。:)谢谢你的解释。这对于我为什么会出现上下文错误更为合理。只是为了澄清一下,我最初调用填充DDL的方式是两次运行查询,一次使用{m=>m.listThrestricts},另一次使用SelectList(Model.listThrestricts),第二次调用导致了错误,因为上下文已经被释放。但是,使用.ToArray()或可能使用.ToList()会导致EF立即执行查询并填充ViewModel。通过不调用.ToArray,代码一直在等待填充,直到在视图中实际调用它?
public static IEnumerable<SelectListItem> GetAllMerits()
{
    using (DataContext ctx = new DataContext())
    {
        var results = (from m in ctx.MeritBadges
                       select new SelectListItem
                       {
                           Value = m.ID.ToString(),
                           Text = m.MeritBadgeName
                       }
                       ).OrderBy(o => o.Text).ToArray(); // .ToArray() => materialize collection. After this data will be returned from database.

        return new SelectList(results, "Value", "Text"); 
    }
}
using (DataContext ctx = new DataContext())
{
    var results = (from m in ctx.MeritBadges
                   select new SelectListItem
                   {
                       Value = m.ID.ToString(),
                       Text = m.MeritBadgeName
                    }
                   ).OrderBy(o => o.Text);

    return new SelectList(results, "Value", "Text");
}
<div class="row">
    <div class="col-md-12">
        @Html.DropDownListFor(m => m.listMerits,
                new SelectList(Model.listMerits, "Text", "Value"))
    </div>
</div>