SQL ошибка при вставке идентификатора с EF в ASP. NET CORE - PullRequest
0 голосов
/ 04 апреля 2020

Я делаю многостраничную регистрацию с сеансом и добавляю в базу данных после того, как мои действия выглядят как

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 отправляет его на 2-й и так далее:

[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); и сохраняю изменения здесь, он работает нормально, но я получаю к 3-й части, которая

[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; }

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Это была ошибка отношения, исправленная после повторного объявления:

int gymId = user.gym.gymID;
user.gym = _context.gyms.Find(gymId);
0 голосов
/ 04 апреля 2020

Я думаю, что это из-за отслеживания Entity Framework. Поскольку вы десериализуете объект User, его десериализованный объект Gym загружается (с существующим идентификатором), но вне отслеживания Entity Framework. Таким образом, поскольку Entity Framework не отслеживает его, он думает, что вы пытаетесь создать новый Gym с существующим Id.

Попробуйте сохранить только Gym Id для User объекта, который вы ' повторная сериализация в сеанс вместо всего объекта Gym.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...