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

时间:2015-02-12 17:58:36

标签: c# entity-framework asp.net-mvc-3

我正在创建一个C#Web应用程序,在那里我可以添加公司以及公司拥有分支机构的地方。一家公司可以拥有多个分支机构。在一个地方可能有几家公司。因此CompaniesTerritory之间的关系是很多

这是我公司目前的型号,

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; }
}

它有一个文本框,它将采用逗号分隔的字符串。所以我使用foreach对其进行迭代,将其添加到表中,

            foreach (var s in company.PostCodeList.Split(','))
            {
                AddPostCode(s, company.CompanyId);
            }

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();
        }
    }

现在我收到以下错误,

  
    

由于已经处理了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 

1 个答案:

答案 0 :(得分:8)

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

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

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

例如,而不是:

return View(mycollection);

尝试:

return View(mycollection.ToList());