2017-10-03 6 views
0

私は、OpenIDDictトークン認証で角度ユニバーサルとasp.netコアを使用するWebアプリケーションで作業しています。IdentityRoleとIdentityUserのAsp.netコア2.0アップグレードの問題

私はカスタムロールとクレーム/許可を持っています。私はasp.netコア1.1のために書かれた以前のプロジェクトから多くのコードを取りました。そのような場合、以下に示すナビゲーションプロパティを含むMicrosoftのドキュメントごとに更新したIdentityUserとIdentityRoleの拡張を作成しなければなりませんでした。私の問題は、私がDbから役割を得て、ユーザーとクレームを含める場合です。

_context.Roles 
      .Include(r => r.Claims) 
      .Include(r => r.Users) 
      .OrderBy(r => r.Name); 

私は役割を取得しますが、ユーザーと請求数がのUserManagerを介してユーザを取得するときにどこかで何かが更新されていない、同じことが起こる、0である、私は0役割と0の請求を入手!私がrolemanagerを使用してユーザーの役割を確認すると、それは機能して役割を返します。私は下にも私のdbContextを含めている。うまくいけばそれは簡単な修正です!

ApplicationRole:

public class ApplicationRole : IdentityRole 
    { 

    public ApplicationRole() 
    { 

    } 
    public virtual ICollection<ApplicationRoleClaim> Claims { get; set; } = new List<ApplicationRoleClaim>(); 
    public virtual ICollection<ApplicationUser> Users { get; set; } = new List<ApplicationUser>(); 

    public ApplicationRole(string roleName) : base(roleName) 
    { 

    } 


    public ApplicationRole(string roleName, string description) : base(roleName) 
    { 
     Description = description; 
    } 






    public string Description { get; set; } 
    } 

ApplicationUser:

public class ApplicationUser : IdentityUser 
    { 
    public virtual string FriendlyName 
    { 
     get 
     { 
     string friendlyName = string.IsNullOrWhiteSpace(FullName) ? UserName : FullName; 

     if (!string.IsNullOrWhiteSpace(JobTitle)) 
      friendlyName = JobTitle + " " + friendlyName; 

     return friendlyName; 
     } 
    } 


    public string JobTitle { get; set; } 
    public string FullName { get; set; } 
    public string Configuration { get; set; } 
    public bool IsEnabled { get; set; } 
    public bool IsLockedOut => this.LockoutEnabled && this.LockoutEnd >= DateTimeOffset.UtcNow; 


    public virtual ICollection<IdentityUserRole<string>> Roles { get; } = new List<IdentityUserRole<string>>(); 


    public virtual ICollection<IdentityUserClaim<string>> Claims { get; } = new List<IdentityUserClaim<string>>(); 


    public virtual ICollection<IdentityUserLogin<string>> Logins { get; } = new List<IdentityUserLogin<string>>(); 
    //public ICollection<Order> Orders { get; set; } 
    } 

ApplicationRoleClaim:

public class ApplicationRoleClaim : IdentityRoleClaim<string> 
    { 

    public virtual ApplicationRole ApplicationRole { get; set; } 

    } 

DbContext:

public class MYDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string> 
    { 
     public MyDbContext(DbContextOptions<MyDbContext> options) 
      : base(options) 
     { 
      Database.EnsureCreated(); 
     } 

     //List of DB Models - Add your DB models here 
     public DbSet<Customer> Customers { get; set; } 
     public DbSet<Product> Product { get; set; } 
     public virtual DbSet<OpenIddictApplication> OpenIddictApplication { get; set; } 
     public virtual DbSet<OpenIddictAuthorization> OpenIddictAuthorization { get; set; } 
     public virtual DbSet<OpenIddictScope> OpenIddictScope { get; set; } 
     public virtual DbSet<OpenIddictToken> OpenIddictToken { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Product>() 
      .Property(b => b.EntryTime) 
      .HasDefaultValueSql("getdate()"); 

     base.OnModelCreating(modelBuilder); 
     modelBuilder.UseOpenIddict(); 
     modelBuilder.Entity<ApplicationRoleClaim>() 
      .HasOne(pt => pt.ApplicationRole) 
      .WithMany(t => t.Claims) 
      .HasForeignKey(pt => pt.RoleId); 
     modelBuilder.Entity<ApplicationUser>() 
      .HasMany(e => e.Claims) 
      .WithOne() 
      .HasForeignKey(e => e.UserId) 
      .IsRequired() 
      .OnDelete(DeleteBehavior.Cascade); 

     modelBuilder.Entity<ApplicationUser>() 
      .HasMany(e => e.Logins) 
      .WithOne() 
      .HasForeignKey(e => e.UserId) 
      .IsRequired() 
      .OnDelete(DeleteBehavior.Cascade); 

     modelBuilder.Entity<ApplicationUser>() 
      .HasMany(e => e.Roles) 
      .WithOne() 
      .HasForeignKey(e => e.UserId) 
      .IsRequired() 
      .OnDelete(DeleteBehavior.Cascade); 

     modelBuilder.Entity<ApplicationRole>() 
    .HasMany(t => t.Claims) 
    .WithOne(r => r.ApplicationRole) 
    .HasForeignKey(pt => pt.RoleId); 

    } 
    } 

EDIT:

私は今、ユーザーの役割を把握していることに気付きました。しかし、私はロールでユーザーカウントを取得できません。ロールをユーザーにリンクしようとしましたが、エラーが発生しました。私は主張と役割を結びつけました:

modelBuilder.Entity<ApplicationRole>() 
    .HasMany(r => r.Claims) 
    .WithOne() 
    .HasForeignKey(c => c.RoleId).IsRequired() 
    .OnDelete(DeleteBehavior.Cascade); 

答えて

0

固定しました! applicationuser:

public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } 


public virtual ICollection<IdentityUserClaim<string>> Claims { get; set; } 

ApplicationRole:私のDbContext更新

public virtual ICollection<IdentityUserRole<string>> Users { get; set; } 

public virtual ICollection<IdentityRoleClaim<string>> Claims { get; set; } 

:私のナビゲーションプロパティが一致するように変更

modelBuilder.Entity<ApplicationUser>().HasMany(u => u.Claims).WithOne().HasForeignKey(c => c.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade); 
    modelBuilder.Entity<ApplicationUser>().HasMany(u => u.Roles).WithOne().HasForeignKey(r => r.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade); 

    modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Claims).WithOne().HasForeignKey(c => c.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade); 
    modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Users).WithOne().HasForeignKey(r => r.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade); 

は最初の移行がOKだった確実にしました。それはすべて働いた。

関連する問題