1

ユーザーとロールのシードデータでデータベースを更新しようとしましたが、 "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のような他のリクエストにコメントしました。

この問題を解決する方法、管理ユーザーを作成する方法、およびビューの編集と作成に役割を表示する方法を教えてもらえますか?

答えて

1

、あなたは、役割を作成ApplicationRole

+1

あなたがViewModelで必要に応じてFirstNameとLastName属性を設定しているので、シードするユーザーのFirstNameとLastNameを追加してみてください。 – Tinaira

+0

はい、それは...それは私の問題を修正 – Arianit

0

シードメソッドは、データベーススキーマがEntityModelと異なる場合にのみ呼び出されます。シードメソッドが実行されない可能性があります。シード方法で

+0

IdentityRoleを置き換えるしかし、役割が作成したばかりしているところだ場合! – Arianit

+0

ロールが作成されましたが、ユーザーは作成しませんでした。また、役割はビューに表示されていません! – Arianit

関連する問題