我正在创建一个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; }
}
它有一个文本框,它将采用逗号分隔的字符串。所以我使用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
答案 0 :(得分:8)
这是因为您等待呈现视图以迭代EF查询生成的集合,并且此时已经处置了上下文。
在访问集合之前,EF实际上并不运行SQL查询,因此您需要强制它在DbContext仍处于活动状态时提取数据并填充集合。
一个简单的解决方案是使用ToList()
,这会导致EF立即检索数据。
例如,而不是:
return View(mycollection);
尝试:
return View(mycollection.ToList());