0

私はASP.NETの初心者で、ASP.NET-MVCプロジェクトのIdentityフレームワークを使ってユーザシステムを構築しようとしています。私は、「管理者」ユーザエンティティを持ちたいapplicationuserからモデルを継承したUsermanager

は(私の軽微な変更で)私のモデルにデフォルトで作成された基本エンティティ「applicationUser」から継承:

public class ApplicationUser : IdentityUser 
{ 
    [Required] 
    [StringLength(50)] 
    [Display(Name = "Last Name")] 
    public string LastName { get; set; } 
    [Required] 
    [StringLength(50, ErrorMessage = "First name cannot be longer than 50 characters.")] 
    [Column("FirstName")] 
    [Display(Name = "First Name")] 
    public string FirstMidName { get; set; } 

    [Display(Name = "Full Name")] 
    public string FullName 
    { 
     get 
     { 
      return LastName + ", " + FirstMidName; 
     } 
    } 
} 
public class Admin: ApplicationUser 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int AdID; 
} 

私もから2他の継承を追加しますapplicationUser、私は別のユーザーが自分のデータベースのfiledsに異なる情報を格納し、それらのすべてが自分のサイトにログインできるようにモデルを分離したいと思っています。

私が最初に(stackoverflowの答えのどこかに撮影した)このコードを使用して、adminユーザーを追加しようとしているスタートアップで

 public static async Task CreateRoles(SchoolContext context, IServiceProvider serviceProvider) 
     { 

      var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>(); 
      var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>(); 
      // First, Creating User role as each role in User Manager 
      List<IdentityRole> roles = new List<IdentityRole>(); 

      roles.Add(new IdentityRole { Name = "Student", NormalizedName = "STUDENT" }); 
      roles.Add(new IdentityRole { Name = "ADMIN", NormalizedName = "ADMINISTRATOR" }); 
      roles.Add(new IdentityRole { Name = "Professor", NormalizedName = "PROFESSOR" }); 

      //Then, the machine added Default User as the Admin user role 
      foreach (var role in roles) 
      { 
       var roleExit = await roleManager.RoleExistsAsync(role.Name); 
       if (!roleExit) 
       { 
        context.Roles.Add(role); 
        context.SaveChanges(); 
       } 
      } 

      await CreateUser(context, userManager); 
     } 


     private static async Task CreateUser(SchoolContext context, UserManager<ApplicationUser> userManager) 
     { 
      var adminUser = await userManager.FindByEmailAsync("[email protected]"); 
      if (adminUser != null) 
      { 
       if (!(await userManager.IsInRoleAsync(adminUser, "ADMINISTRATOR"))) 
        await userManager.AddToRoleAsync(adminUser, "ADMINISTRATOR"); 
      } 
      else 
      { 
       var newAdmin = new applicationUser() 
       { 
        UserName = "[email protected]", 
        Email = "[email protected]", 
        LastName = "Admin", 
        FirstMidName = "Admin", 

       }; 
       var result = await userManager.CreateAsync(newAdmin, "password123;"); 
       if (!result.Succeeded) 
       { 
        var exceptionText = result.Errors.Aggregate("User Creation Failed 
        - Identity Exception. Errors were: \n\r\n\r", 
        (current, error) => current + (" - " + error + "\n\r")); 
        throw new Exception(exceptionText); 
       } 
       await userManager.AddToRoleAsync(newAdmin, "ADMINISTRATOR"); 
      } 
     } 

しかし、私はそれをしようとするとき、私は例外を受け取る: 「挿入することはできません値 'NULL'列 'Discriminator'、テーブル 'aspnet-University;列はNULLを許可しません。INSERTは失敗します。 ステートメントが終了しました。

「new applicationUser」ではなく「new Admin」で変数管理タイプを変更しようとすると、別の例外が発生します。 エンティティタイプ「Admin」が見つかりませんでした。エンティティタイプがモデルに追加されていることを確認します。

この質問はIDフレームワークの基本に関するものです。私はまだよく理解していません。私はちょうどそれがprinicplesであることを理解し始めた、私は私の問題を処理する方法を知らない。

私は新しいUserManagerを作成する必要があると思います。これは、基本的なapplicationUserモデルから継承するインスタンスを操作できるようになります。このトピックに関する関連リソースをお勧めし、私の問題を解決するのに役立ちますと、私は幸せになれます。

答えて

0

誰かがこの質問をする場合、私はApplicationUserからの継承を使用しないことにしました。明らかに間違ったアプローチだったため、IdentityUserクラスからすべてのカスタムユーザーモデルを継承しています。私はスタートアップの設定サービスに追加したこの作品を作るために、この行:

services.AddIdentity <IdentityUser, IdentityRole>() 
       .AddEntityFrameworkStores<YourContext>() 
       .AddDefaultTokenProviders(); 

は私のユーザモデルは次のように宣言:

public class Admin : IdentityUser 
    { 
    } 

とコンテキストファイルに私はこれがあります。

protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<IdentityUser>(i => { 
       i.ToTable("Users"); 
       i.HasKey(x => x.Id); 
      }); 
      modelBuilder.Entity<IdentityRole<>(i => { 
       i.ToTable("Role"); 
       i.HasKey(x => x.Id); 
      }); 
} 

このコードでは、IdentityのUserManagerとRoleManagerを追加変更なしで使用できます。

関連する問題