DbContext已被处理,没有任何意义

Pau*_*cis 4 c# entity-framework asp.net-mvc-3

我正在创建一个C#Web应用程序,在那里我可以添加公司以及公司拥有分支机构的地方.一家公司可以拥有多个分支机构.在一个地方可能有几家公司.所以之间的关系Companies,并Territory多对多.

这是我目前的公司模型,

public class CompanyModel
{

    [HiddenInput(DisplayValue = false)]
    public long CompanyId { get; set; }

    [Display(Name = "Company Name")]
    [Required(ErrorMessage = "* required")]
    public string CompanyName { get; set; }

    [Display(Name = "Phone Number")]
    [Required(ErrorMessage = "* required")]
    [RegularExpression(@"\d*", ErrorMessage = "Not a valid phone number")]
    public string PhoneNo { get; set; }


    [Display(Name = "Post Code List", Prompt = "eg. BA5, BS16")]
    public string PostCodeList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它有一个文本框,它将采用逗号分隔的字符串.所以我用foreach它来迭代它将它添加到表中,

            foreach (var s in company.PostCodeList.Split(','))
            {
                AddPostCode(s, company.CompanyId);
            }
Run Code Online (Sandbox Code Playgroud)

AddPostcode的位置,

    public void AddPostCode(string postCode, long companyId)
    {
        using (var db = new BoilerServicingDbContext())
        {
            //Does post code exist
            var p = db.Territories.FirstOrDefault(x => x.PostCodePrefix == postCode);

            //if not create
            if (p == null)
            {
                p = new Territory
                {
                    PostCodePrefix = postCode
                };
                db.Territories.Add(p);
            }
            //get the company
            var c = db.Companies.First(x => x.Id == companyId);

            //add post code
            c.Territories.Add(p);

            //save
            db.SaveChanges();
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在我收到以下错误,

由于已经处理了DbContext,因此无法完成操作.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.InvalidOperationException:无法完成操作,因为已释放DbContext.

异常详细信息:System.InvalidOperationException:Sequence不包含任何元素

Source Error:

Line 16:         </thead>
Line 17:         <tbody>
Line 18:         @foreach (var a in Model)
Line 19:             {
Line 20:                 <tr>

Source File: c:\Source\LSP.HEA.BoilerServicing\Main\LSP.HEA.BoilerServicing.Web\Views\Companies\Index.cshtml
Line: 18 
Run Code Online (Sandbox Code Playgroud)

Ala*_*lan 8

发生这种情况是因为您要等待呈现视图以迭代EF查询生成的集合,并且此时已经处置了上下文.

在访问集合之前,EF实际上并不运行SQL查询,因此您需要强制它在DbContext仍处于活动状态时提取数据并填充集合.

一个简单的解决方案是使用ToList(),这会导致EF立即检索数据.

例如,而不是:

return View(mycollection);
Run Code Online (Sandbox Code Playgroud)

尝试:

return View(mycollection.ToList());
Run Code Online (Sandbox Code Playgroud)