ASP.NET CORE中带有EF的ID插入上的SQL错误

问题描述 投票:0回答:2

[请花一点时间阅读,然后将其添加到另一个无关的问题中。

我正在使用会话进行多页注册,然后将其添加到数据库中,所以我的操作就像

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; }
c# asp.net asp.net-core
2个回答
0
投票

我认为这是由于Entity Framework的跟踪。由于要对User对象进行反序列化,因此将其反序列化的Gym对象(使用现有ID)加载到实体框架的跟踪范围之外。因此,由于Entity Framework没有跟踪它,因此它认为您正在尝试使用现有ID创建新的Gym

[尝试仅将要序列化为会话的Gym对象上的User ID,而不是整个Gym对象上的存储。


0
投票

是一些关联错误,在重新声明后已修复int gymId = user.gym.gymID;user.gym = _context.gyms.Find(gymId);

© www.soinside.com 2019 - 2024. All rights reserved.