除非我 stop/start 调试,否则实体不会更新
Entity not updating unless I stop/start debugging
我有一个 DbSet 实体 db.Payscales
我的网站上有一个页面,您可以在其中更新薪级表,还有一个页面,您可以从下拉菜单中 select 薪级表。
更新薪级表非常有效,甚至会更改数据库中的值。但是,在下拉列表中,值不会更新。它保留了项目构建时的最后一个值"known"。
解决此问题的唯一方法是停止调试并重新启动站点(实质上是重建),然后重新启动它。在此之后,值会在下拉列表中正确显示。
如果我不够彻底,我深表歉意,但这似乎更像是一个关于实体的一般问题,而不是代码本身的问题。
为了安全起见,这里是下拉菜单的代码:
DropDownValues.cs
public static List<SelectListItem> GetPayScaleList()
{
List<SelectListItem> ls = new List<SelectListItem>();
ls.Add(new SelectListItem() { Text = "", Value = "" });
foreach (var temp in db.PayScales)
{
ls.Add(new SelectListItem() { Text = temp.Salary + "|" + temp.BaseGross, Value = temp.Salary.ToString() });
}
return ls;
}
以及实际下拉菜单本身的代码:
@Html.DropDownListFor(modelItem => modelItem.teacher.SalaryCode , TeachersProj.Models.DropDropValues.GetPayScaleList())
编辑:
应邀,更新方法也在此!
PayScalesController.cs
//
// POST: /PayScales/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(PayScale payscale)
{
if (ModelState.IsValid)
{
db.Entry(payscale).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(payscale);
}
在我看来,您只需要在数据库更新后刷新页面即可。由于您使用 @Html
指令(我假设这是一个基于此的 MVC 项目)来获取下拉列表,因此列表的内容是在加载页面时定义的。在您重新加载页面之前,更新数据库不会反映在 UI 中。
如果您想在不重新加载页面的情况下动态更新下拉列表,您将需要实施某种 Ajax 调用 GetPayScaleList()
并设置下拉列表内容的轮询或实施某种SignalR 推送式更新(可能矫枉过正)。
编辑:
试试这个更新逻辑:
public ActionResult Edit(PayScale payscale)
{
if (ModelState.IsValid)
{
var existingEntry = db.Find(payscale);
if(existingEntry != null)
{
db.Entry(existingEntry).CurrentValues.SetValues(payscale);
db.SaveChanges();
}
else
{
//Handle updating a missing record how you want
}
return RedirectToAction("Index");
}
return View(payscale);
}
原来实体正在更新,由于某种原因需要一个多小时才能更新。
停止和重建时,这会强制执行某些操作,这就是它进行更新的原因。不过我休息一会回来,又更新了。
我有一个 DbSet 实体 db.Payscales
我的网站上有一个页面,您可以在其中更新薪级表,还有一个页面,您可以从下拉菜单中 select 薪级表。
更新薪级表非常有效,甚至会更改数据库中的值。但是,在下拉列表中,值不会更新。它保留了项目构建时的最后一个值"known"。
解决此问题的唯一方法是停止调试并重新启动站点(实质上是重建),然后重新启动它。在此之后,值会在下拉列表中正确显示。
如果我不够彻底,我深表歉意,但这似乎更像是一个关于实体的一般问题,而不是代码本身的问题。
为了安全起见,这里是下拉菜单的代码:
DropDownValues.cs
public static List<SelectListItem> GetPayScaleList()
{
List<SelectListItem> ls = new List<SelectListItem>();
ls.Add(new SelectListItem() { Text = "", Value = "" });
foreach (var temp in db.PayScales)
{
ls.Add(new SelectListItem() { Text = temp.Salary + "|" + temp.BaseGross, Value = temp.Salary.ToString() });
}
return ls;
}
以及实际下拉菜单本身的代码:
@Html.DropDownListFor(modelItem => modelItem.teacher.SalaryCode , TeachersProj.Models.DropDropValues.GetPayScaleList())
编辑:
应邀,更新方法也在此!
PayScalesController.cs
//
// POST: /PayScales/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(PayScale payscale)
{
if (ModelState.IsValid)
{
db.Entry(payscale).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(payscale);
}
在我看来,您只需要在数据库更新后刷新页面即可。由于您使用 @Html
指令(我假设这是一个基于此的 MVC 项目)来获取下拉列表,因此列表的内容是在加载页面时定义的。在您重新加载页面之前,更新数据库不会反映在 UI 中。
如果您想在不重新加载页面的情况下动态更新下拉列表,您将需要实施某种 Ajax 调用 GetPayScaleList()
并设置下拉列表内容的轮询或实施某种SignalR 推送式更新(可能矫枉过正)。
编辑:
试试这个更新逻辑:
public ActionResult Edit(PayScale payscale)
{
if (ModelState.IsValid)
{
var existingEntry = db.Find(payscale);
if(existingEntry != null)
{
db.Entry(existingEntry).CurrentValues.SetValues(payscale);
db.SaveChanges();
}
else
{
//Handle updating a missing record how you want
}
return RedirectToAction("Index");
}
return View(payscale);
}
原来实体正在更新,由于某种原因需要一个多小时才能更新。
停止和重建时,这会强制执行某些操作,这就是它进行更新的原因。不过我休息一会回来,又更新了。