ユーザーとロールのシードデータでデータベースを更新しようとしましたが、 "1つ以上のエンティティで検証に失敗しました。詳細についてはEntityValidationErrorsプロパティを参照してください。エラー。ロールが作成され、dbテーブルに表示されますが、管理者役割を持つユーザーは作成されません。また、ロールは作成および編集ユーザービューに表示されません。Asp.Netでユーザーとロールのデータをシードしようとしましたがエラーが発生しましたmvc 5 EntityFramework 6
ViewModelにユーザー作成するためのユーザ編集に
public class InsertUser
{
[Required]
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
[Display(Name = "First Name")]
[RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$", ErrorMessage = "The {0} must start with upper letter and contain only alphabetical letters")]//requires the first character to be upper case and the remaining characters to be alphabetical
public string FirstName { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
[Display(Name = "Last Name")]
[RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$", ErrorMessage = "The {0} must start with upper letter and contain only alphabetical letters")]
public string LastName { get; set; }
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Display(Name = "User Name")]
public string UserName { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm new password")]
[Compare("Password", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
public List<CheckBoxItem> Roles { get; set; }
}
public class CheckBoxItem
{
public string Id { get; set; }
public string Text { get; set; }
public bool Checked { get; set; }
}
のViewModelを:私は編集のために自分のviewmodelsを作成
public class EditUser
{
public EditUser()
{
Roles = new List<CheckBoxItem>();
}
[Key]
public string Id { get; set; }
[Display(Name = "User Name")]
public string UserName { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
[Display(Name = "First Name")]
[RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$", ErrorMessage = "The {0} must start with upper letter and contain only alphabetical letters")]
public string FirstName { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
[Display(Name = "Last Name")]
[RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$", ErrorMessage = "The {0} must start with upper letter and contain only alphabetical letters")]
public string LastName { get; set; }
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
public List<CheckBoxItem> Roles { get; set; }
}
をし、シナリオはそのようなものですcuzのユーザーを作成し、ユーザーは管理者から作成されなければならないので、物事を分けておくために、自分のViewModelをAccountViewModelとは別に作成しました。しかし、それだけでなく、シンプルなユーザーは、Eメール、ユーザー名、パスワードを持つ個々のユーザーアカウントを持つASp.Net MVCのボックスのように作成できます。管理者には、FirstNameやLastNameのような詳細を追加してロールを割り当てる特権があります。
作成(および編集)ビュー:
...
<div class="form-group">
@Html.LabelFor(model => model.Roles, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.CheckBoxListFor(model => model.Roles
, model => model.Roles
, model => model.Id
, model => model.Text
, model => model.Checked
, model => new { @class = "checkbox-inline" })
</div>
</div>
...
私はChechBoxListForのHTMLヘルパーのためのMvcCheckBoxListのnugetを設置。
ユーザーを作成するためのgetアクションメソッド:
public ActionResult Create()
{
var items = new InsertUser();
items.Roles = _roleManager.Roles.Select(x => new CheckBoxItem { Id = x.Id, Text = x.Name, Checked = false }).ToList();
return View(items);
}
と構成クラス、シード方法:
if (!context.Roles.Any(r => r.Name == "admin"))
{
var store = new RoleStore<IdentityRole>(context);
var manager = new RoleManager<IdentityRole>(store);
var role = new IdentityRole { Name = "admin" };
manager.Create(role);
}
if (!context.Roles.Any(r => r.Name == "user"))
{
var store = new RoleStore<IdentityRole>(context);
var manager = new RoleManager<IdentityRole>(store);
var role = new IdentityRole { Name = "user" };
manager.Create(role);
}
if (!context.Users.Any(u => u.UserName == "admin"))
{
var store = new UserStore<ApplicationUser>(context);
var manager = new UserManager<ApplicationUser>(store);
var user = new ApplicationUser { UserName = "admin", Email="[email protected]" };
manager.Create(user, "password123");
manager.AddToRole(user.Id, "admin");
}
そして、ちょうどについては、私は最小6文字を必要とするためにパスワードを作りました私は、RequiredLowercase、RequieredUppercase、RequireNonLetterOrDigit、RequireDigitのような他のリクエストにコメントしました。
この問題を解決する方法、管理ユーザーを作成する方法、およびビューの編集と作成に役割を表示する方法を教えてもらえますか?
あなたがViewModelで必要に応じてFirstNameとLastName属性を設定しているので、シードするユーザーのFirstNameとLastNameを追加してみてください。 – Tinaira
はい、それは...それは私の問題を修正 – Arianit