当我尝试从实体框架更新记录时,记录将从表中删除。没有抛出任何错误,所以它让我感到困惑的是发生了什么。
我对实体框架和asp.net相当新。我已经学习了大约一个月了。
我可以更新记录而不会出现SQL Server的任何问题,但不会来自vs.这里是更新数据库的代码:
// GET: /Scorecard/Edit/5
public ActionResult Edit(int id, string EmployeeName)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
CRS_Monthly crs_monthly = GetAgentById(id);
crs_monthly.EmployeeName = EmployeeName;
if (crs_monthly == null)
{
return HttpNotFound();
}
return View(crs_monthly);
}
// POST: /Scorecard/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="REC_ID,Cur_Plan,Plan_Update,Comments,Areas_Improve,Strengths,UPDATED_BY,UPDATED_TIME,Agent_Recognition")] CRS_Monthly crs_monthly)
{
if (ModelState.IsValid)
{
crs_monthly.UPDATED_TIME = DateTime.Now;
crs_monthly.UPDATED_BY = Request.LogonUserIdentity.Name.Split('\\')[1];
db.Entry(crs_monthly).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(crs_monthly);
}
当我运行调试器时,crs_monthly有效并且在db.SaveChanges()之前看起来很好。非常感谢任何帮助!
答案 0 :(得分:0)
您应该从不保存从帖子创建的实体实例,尤其是当您利用Bind
限制从帖子数据绑定哪些属性时。相反,始终从数据库中提取实体,并将发布的值映射到它。这可确保不会丢失任何数据。
无论如何,使用Bind
是一种可怕的做法。它的主要问题是所有属性都列为字符串值,并且您引入了维护问题。如果删除其中一个属性或更改名称,则Bind
列表不会自动更新。您必须记住更改每个实例。更糟糕的是,如果添加属性,则必须记住返回并将其包含在此列表中,否则您的数据将被静默删除而不会发出通知。
如果您只需要在实体上使用属性的子集,请创建仅包含这些属性的视图模型。然后,再次将视图模型中的已发布值映射到从数据库中提取的实体实例。