【问题标题】:SaveChanges not working on JsonResult method (UPDATE INFO)SaveChanges 不适用于 JsonResult 方法(更新信息)
【发布时间】:2019-04-08 17:15:23
【问题描述】:

问题基本上是保存更改方法不起作用(更新),该方法应该接收 3 个参数,项目 ID、用户 ID 和包含来自 UI 的更新信息的对象,但是代码似乎有些不好因为 saveChanges() 方法不起作用。

这是我的代码:

[HttpPost]
    [AllowAnonymous]
    public JsonResult UpdatePersonalData(int ItemId, int UserId, CND_PersonalData Item)
    {
        try
        {
            if (ModelState.IsValid)
            {
                using (var context = new DexusEntities())
                {
                    CND_PersonalData PersonalData = context.CND_PersonalData.Where(d => d.Id == ItemId && d.UserId == UserId).SingleOrDefault();
                    if (PersonalData == null)
                    {
                        /// Display bad request
                        /// User does not exist and/or is not activated
                        List<RootObject> rootObj = new List<RootObject>();
                        rootObj.Add(new RootObject
                        {
                            msg = "User/Item not found in our DB",
                            code = "error_07"
                        });
                        HttpContext.Response.StatusCode = 404;
                        HttpContext.Response.TrySkipIisCustomErrors = true;
                        JsonRes.Message = rootObj;
                        return Json(JsonRes, JsonRequestBehavior.AllowGet);
                    }
                    else
                    {
                        PersonalData = Item;
                        context.SaveChanges();
                        context.ChangeTracker.DetectChanges();
                        List<RootObject> rootObj = new List<RootObject>();
                        rootObj.Add(new RootObject
                        {
                            msg = "Information stored/updated successfully",
                            code = "success_05"
                        });
                        HttpContext.Response.StatusCode = 200;
                        JsonRes.Message = rootObj;
                        return Json(JsonRes, JsonRequestBehavior.AllowGet);
                    }
                }
            }
            else
            {
                List<RootObject> rootObj = new List<RootObject>();
                JsonRes.Issue = "The model is not correct";
                rootObj.Add(new RootObject
                {
                    msg = "Model is not valid",
                    code = "error_03"
                });
                HttpContext.Response.StatusCode = 403;
                HttpContext.Response.TrySkipIisCustomErrors = true;// Avoid issues in the HTTP methods
                JsonRes.Message = rootObj;
                return Json(JsonRes, JsonRequestBehavior.AllowGet);
            }
        }
        catch (Exception ex)
        {
            string err = ex.ToString();
            List<RootObject> rootObj = new List<RootObject>();
            JsonRes.Issue = err;
            rootObj.Add(new RootObject
            {
                msg = "Conflict with method, see issue description.",
                code = "error_08"
            });
            HttpContext.Response.StatusCode = 400;// Bad request
            HttpContext.Response.TrySkipIisCustomErrors = true;
            JsonRes.Message = rootObj;
            return Json(JsonRes, JsonRequestBehavior.AllowGet);
        }
    }

我的代码有什么问题? 提前致谢。

【问题讨论】:

  • 您能否详细说明“不起作用”?有例外吗?什么行为?
  • 该方法完美运行,没有错误,我实际上已经逐行调试了代码,它没有显示任何问题,似乎一切正常。
  • 但是在数据库中没有变化。

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


【解决方案1】:

正如我所见,您没有在 DbSet 中添加项目并在之后调用 SaveChanges:

添加项时,应将其放入 DbSet

context.CND_PersonalData.Add(item);
context.SaveChanges();

当您想更新时,只需在更新加载的对象后调用 SaveChanges

    var PersonalData= context.CND_PersonalData.Where(d => d.Id == ItemId && d.UserId == UserId).SingleOrDefault();
 PersonalData.Name = item.Name;
PersonalData.Title = item.Title;
    context.SaveChanges();

您不能只将传递的对象分配给从数据库中获得的实体,您需要更改属性。如果您照常执行此操作,则不会更改加载对象中的值。因此,当您调用 SaveChanges 时,没有任何改变。您需要一一更改属性。

如果您不想这样做,那么您可以通过在上下文中使用 Attach 方法将您的项目附加到数据库中。

context.Attach(item);
context.SaveChanges();

但你应该小心,因为如果你在检查它是否为空之前加载和跟踪具有相同 id 的项目:

CND_PersonalData PersonalData = context.CND_PersonalData.Where(d => d.Id == ItemId && d.UserId == UserId).SingleOrDefault();
                    if (PersonalData == null)
                    {

那么你会在保存过程中得到一个错误,因为上下文已经在跟踪具有相同 ID 的项目,所以你可以删除该检查并检查它是否存在:

if (context.CND_PersonalData.Any(d => d.Id == ItemId && d.UserId == UserId))
   {

然后执行你的代码

【讨论】:

  • 很好的解释。需要映射。我很感激。
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多