EF не вставляется в базу данных после добавления новых свойств в регистрационную форму

#c# #asp.net #entity-framework

#c# #asp.net #entity-framework

Вопрос:

Я добавил два новых поля в RegisterViewModel класс в asp.net Код по умолчанию MVC. Проверка работает, но значения для вновь добавленных полей не вставляются в базу данных, вставляются другие поля. Со страницы не возвращается ошибка.

Я предполагаю, что мне нужно что-то сделать внутри AccountController класса, где-то здесь:

 var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
 

Не уверен, как именно.

     public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
               //await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                 string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                 var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                 await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=""   callbackUrl   "">here</a>");

                TempData["Email"] = user.Email;
                return RedirectToAction("Confirm", "Account");
            }
            AddErrors(result);
        }
        // If we got this far, something failed, redisplay form
        return View(model);
    }
 

Комментарии:

1. Не могли бы вы поделиться кодом.

2. Вы уверены, что SaveChanges это вызывается для вашего контекстного объекта?

3. У меня нет SaveChanges в AccountController

4. @Dai Только поля, которые я только что добавил, не вставляются в базу данных. Вставляются другие поля.

5. @hello может быть связано с тем, что вы добавили в viewmodel не в entity.

Ответ №1:

Если вам нужно добавить новое поле в базу данных, вам нужно добавить, чтобы изменить модель ApplicationUser , а не ViewModel RegisterViewModel . Итак, в вашем вопросе вам нужно добавить новое поле в RegisterViewModel модель, но на самом деле вам нужно обновить ApplicationUser класс, поскольку RegisterViewModel он используется только для пользовательского интерфейса. Например, чтобы добавить новое поле PersonId , вам необходимо изменить свою ApplicationUser модель и перенести базу данных

 public class ApplicationUser : IdentityUser
    {
    public string PersonId { get; set; }
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
    }
 

и добавьте public string PersonId { get; set; } в свою ViewModel RegisterViewModel любую необходимую проверку, а затем в коде сохранения преобразуйте ViewModel в Model

 var user = new ApplicationUser 
            {
                UserName = model.Email,
                Email = model.Email,
                PersonId = model.PersonId,
            };
result = await UserManager.CreateAsync(user, model.Password);
 

Ответ №2:

Вы не назначили новые свойства в ApplicationUser экземпляре, допустим, вы добавили свойство `PhoneNumber’ внутри класса модели, затем вам нужно скопировать его значение для пользователя, как показано ниже

 var user = new ApplicationUser { UserName = model.Email, Email = model.Email,PhoneNumber=model.PhoneNumber };