私は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モデルから継承するインスタンスを操作できるようになります。このトピックに関する関連リソースをお勧めし、私の問題を解決するのに役立ちますと、私は幸せになれます。