SaveChanges 不适用于 JsonResult 方法(更新信息)
SaveChanges not working on JsonResult method (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();
您不能只将传递的对象分配给从数据库中获得的实体,您需要更改属性。如果你这样做,你没有改变加载对象中的值。因此,当您调用 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))
{
然后执行你的代码
问题基本上是保存更改方法不起作用(更新),该方法应该接收 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();
您不能只将传递的对象分配给从数据库中获得的实体,您需要更改属性。如果你这样做,你没有改变加载对象中的值。因此,当您调用 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))
{
然后执行你的代码