当我尝试从实体框架MVC更新记录时,为什么我的记录会从数据库中删除?

时间:2017-01-06 12:43:29

标签: sql asp.net-mvc entity-framework

当我尝试从实体框架更新记录时,记录将从表中删除。没有抛出任何错误,所以它让我感到困惑的是发生了什么。

我对实体框架和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()之前看起来很好。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您应该从不保存从帖子创建的实体实例,尤其是当您利用Bind限制从帖子数据绑定哪些属性时。相反,始终从数据库中提取实体,并将发布的值映射到它。这可确保不会丢失任何数据。

无论如何,使用Bind是一种可怕的做法。它的主要问题是所有属性都列为字符串值,并且您引入了维护问题。如果删除其中一个属性或更改名称,则Bind列表不会自动更新。您必须记住更改每个实例。更糟糕的是,如果添加属性,则必须记住返回并将其包含在此列表中,否则您的数据将被静默删除而不会发出通知。

如果您只需要在实体上使用属性的子集,请创建仅包含这些属性的视图模型。然后,再次将视图模型中的已发布值映射到从数据库中提取的实体实例。