[请花一点时间阅读,然后将其添加到另一个无关的问题中。
我正在使用会话进行多页注册,然后将其添加到数据库中,所以我的操作就像
public IActionResult Register(RegisterViewModel registerViewModel)
{
if (ModelState.IsValid)
{
if (!_context.users.Any(u => u.Email == registerViewModel.User.Email))
{
User user = new User
{
firstName = registerViewModel.User.firstName,
...
};
HttpContext.Session.SetString("SessionUser", Newtonsoft.Json.JsonConvert.SerializeObject(user));
registerViewModel.gyms = _context.gyms.ToList();
return View("~/Views/Account/Register2.cshtml", registerViewModel);
}
ModelState.AddModelError("Email", "This Email is taken");
}
return View(registerViewModel);
}
它从表单获取数据,将其保存为json格式的会话,然后将其发送到第二个,依此类推:
[HttpPost]
public IActionResult Register2(RegisterViewModel registerViewModel)
{
if (registerViewModel.gym != null)
{
User user = JsonConvert.DeserializeObject<User>(HttpContext.Session.GetString("SessionUser"));
user.gym = _context.gyms.Find(registerViewModel.gym.gymID);
....
HttpContext.Session.SetString("SessionUser", JsonConvert.SerializeObject(user));
RegisterViewModel model = new RegisterViewModel()
{
User = user,
gym = user.gym
};
return View("~/Views/Account/Register3.cshtml", model);
}
}
如果我执行context.Add(user);
并在此处保存更改,它可以正常工作,但是我进入了第三个部分,即
[HttpPost]
public IActionResult Register3(RegisterViewModel registerViewModel)
{
if (registerViewModel.User != null)
{
User user = JsonConvert.DeserializeObject<User>(HttpContext.Session.GetString("SessionUser"));
...
user.Token = Guid.NewGuid().ToString();
_context.Add(user);
_context.SaveChanges();
Response.Cookies.Append("token", user.Token, new CookieOptions
{
Expires = DateTime.Now.AddYears(1),
HttpOnly = true
});
return RedirectToAction("Login", "Account");
}
}
我收到错误
SqlException:当IDENTITY_INSERT设置为OFF时,不能在表运动场中为标识列插入显式值,运动场是DbSet运动场。
我发现避免此错误的方法是将用户添加到Register2上的数据库,然后再次在Register3上对其进行更新,但是该作品导致在完成注册之前添加用户的问题,我阅读了其他类似的文章这个错误的问题,当gymID添加到数据库中却找不到相关性时,它将导致此错误。
我的用户模型是这样的:
[Key]
[Required]
public int UserID { get; set; }
[Required]
[MaxLength(100)]
public String firstName { get; set; }
....
public Gym gym { get; set; }
我认为这是由于Entity Framework的跟踪。由于要对User
对象进行反序列化,因此将其反序列化的Gym
对象(使用现有ID)加载到实体框架的跟踪范围之外。因此,由于Entity Framework没有跟踪它,因此它认为您正在尝试使用现有ID创建新的Gym
。
[尝试仅将要序列化为会话的Gym
对象上的User
ID,而不是整个Gym
对象上的存储。
是一些关联错误,在重新声明后已修复int gymId = user.gym.gymID;user.gym = _context.gyms.Find(gymId);