我有一个名为SectionUser
的表,如下所示:
USER_ID
(varchar(255)
)(主键)NAME
(varchar(255)
)以下是示例值:
USER ID | NAME
--------+--------------
EVTAB | ELMER TABER
FAYKVIL | FAYK VILLET
每当我单击网页表中行中的“编辑”选项卡时,便可以检索数据。当我尝试编辑“名称”时。我可以成功编辑名称。但是我无法编辑USER_ID
(这是我的主键)
在调试模式下尝试时,当我在USER_ID
下的文本框中编辑数据时,不会获得USER_ID
数据。但是它是从NAME
的文本框中获取数据的。
控制器:
public ActionResult EditUser(string USER_ID)
{
if (USER_ID == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
SectionUser section = db.SectionUsers.Find(USER_ID);
if (section == null)
{
return HttpNotFound();
}
return View(section);
}
[HttpPost]
public ActionResult EditUser(Users User)
{
try
{
if (ModelState.IsValid)
{
_context.Entry(User).State = EntityState.Modified;
_context.SaveChanges();
return RedirectToAction("Users");
}
}
catch(Exception e)
{
e.ToString();
}
return View(User);
}
查看(cshtml)
@using (Html.BeginForm("EditUser", "Admin", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Section</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.USER_ID)
<div class="form-group">
@Html.LabelFor(model => model.USER_ID, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.USER_ID, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.USER_ID, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.NAME, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.NAME, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.NAME, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}
我编辑主键的原因是给我的是数据库模型。 SectionUser
具有UserRole
的外键。因此,我使用了层叠更新。每当我编辑USER_ID
中的SectionUser
时,UserRole
USER_ID
也会被更新。
答案 0 :(得分:1)
恕我直言,您应该重构数据库模型,使其具有独立于其他列的单独主键列。实体框架或其他ORM会基于主键更新数据,如果您在代码中更新了主键值本身,则实体框架无法找出要更新的行。
另一种方法是使用经典的ado.net并编写自己的sql查询。
@Camilo回答的代码会给您一个运行时错误:
{“属性'user_id'是对象键信息的一部分, 无法修改。 “}
答案 1 :(得分:1)
这是我尝试过的:
我创建了一个存储过程来更新主键。
UPDATE dbo.SectionUser
SET USER_ID = @USER_ID
WHERE NAME = @NAME
然后,我创建了一个函数void execEditUserId()
,该函数是通过EditUser()
Action方法调用的。