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)
发生这种情况是因为您要等待呈现视图以迭代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)
| 归档时间: |
|
| 查看次数: |
3715 次 |
| 最近记录: |