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