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失败然后直接返回页面的处理办法