CRUD Edit无法编辑主键

时间:2018-07-20 00:38:32

标签: c# asp.net-mvc entity-framework

我有一个名为SectionUser的表,如下所示:

  • USER_IDvarchar(255))(主键)
  • NAMEvarchar(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也会被更新。

2 个答案:

答案 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方法调用的。