Проблема в основном в том, что метод сохранения изменений не работает (обновление), метод должен получать 3 параметра, идентификатор элемента, идентификатор пользователя и объект, который содержит обновленную информацию из пользовательского интерфейса, однако код кажется чем-то плохим, потому что 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();
но вы должны быть осторожны, потому что если вы загружаете и отслеживаете элемент с тем же идентификатором, что и вы, прежде чем проверять, является ли он нулевым:
CND_PersonalData PersonalData = context.CND_PersonalData.Where(d => d.Id == ItemId && d.UserId == UserId).SingleOrDefault();
if (PersonalData == null)
{
тогда вы получите ошибку во время сохранения, потому что контекст уже отслеживает элемент с тем же идентификатором, поэтому вы можете удалить эту проверку и просто проверить, существует ли она:
if (context.CND_PersonalData.Any(d => d.Id == ItemId && d.UserId == UserId))
{
а затем выполните свой код
Отличное объяснение. Нужен был маппинг. Я признателен за это.
Не могли бы вы уточнить "не работает"? Есть ли исключение? Каково поведение?