SaveChanges无法处理JsonResult方法(UPDATE INFO)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SaveChanges无法处理JsonResult方法(UPDATE INFO)相关的知识,希望对你有一定的参考价值。

问题基本上是保存更改方法不起作用(更新),该方法应该接收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);
        }
    }

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

答案

我可以看到你没有在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();

您不能只将传递的对象分配给从DB获得的实体,您需要更改属性。如果按原样执行此操作,则不会更改已加载对象中的值。因此,当您调用SaveChanges时,没有任何更改。您需要逐个更改属性。

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

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

但是你应该小心,因为如果你在检查它是否为null之前加载和跟踪具有相同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))
   {

然后执行您的代码

以上是关于SaveChanges无法处理JsonResult方法(UPDATE INFO)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 DbContext 实体框架核心 SaveChanges()

无法将 .net 5 mvc 中的 jsonresult 中的两个参数返回到 ajax

EF执行savechanges失败然后直接返回页面的处理办法

Mvc重写JsonResult

从 JsonResult 反序列化 GenericXMLSecurityToken

统一进行数据上下文的SaveChanges操作