ASP.NET Core 2-AspNetRoleClaims

Wal*_*ure 0 asp.net-core ef-core-2.0

我从一个空的asp.net core 2项目开始,想要向其添加功能,以便我可以学习所有内容。我已经创建了一个连接到的Azure数据库,并且我的项目中有一个dbContext。我正在使用ASP.NET Core标识,并且已成功将表添加到应用程序中。我试图在数据库上下文中进行一些更改,并将其推送到数据库中。据我了解,这需要使用EF Core中的“代码优先”来完成。当我尝试在PMC中创建新迁移时,出现以下错误。我不知道这是什么意思。有什么想法吗?我该如何解决?

TIA

错误信息:

无法将表'AspNetRoleClaims'用于实体类型'AspNetRoleClaims',因为它已用于实体类型'IdentityRoleClaim',并且主键{'Id'}和主键{'Id'}之间没有关系。

我的数据库上下文的来源:

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;

namespace PooperApp.Models
{
    public partial class PoopTheWorldContext : Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
    {
        public virtual DbSet<AspNetRoleClaims> AspNetRoleClaims { get; set; }
        public virtual DbSet<AspNetRoles> AspNetRoles { get; set; }
        public virtual DbSet<AspNetUserClaims> AspNetUserClaims { get; set; }
        public virtual DbSet<AspNetUserLogins> AspNetUserLogins { get; set; }
        public virtual DbSet<AspNetUserRoles> AspNetUserRoles { get; set; }
        public virtual DbSet<AspNetUsers> AspNetUsers { get; set; }
        public virtual DbSet<AspNetUserTokens> AspNetUserTokens { get; set; }
        public virtual DbSet<Clean> Clean { get; set; }
        public virtual DbSet<Country> Country { get; set; }
        public virtual DbSet<PoopLocation> PoopLocation { get; set; }
        public virtual DbSet<Province> Province { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            if (!optionsBuilder.IsConfigured)
            {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
                optionsBuilder.UseSqlServer(@"......");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<AspNetRoleClaims>(entity =>
            {
                entity.HasKey(e => e.Id);
                entity.HasIndex(e => e.RoleId);

                entity.HasOne(d => d.Role)
                    .WithMany(p => p.AspNetRoleClaims)
                    .HasForeignKey(d => d.RoleId);
            });

            modelBuilder.Entity<AspNetRoles>(entity =>
            {
                entity.HasIndex(e => e.NormalizedName)
                    .HasName("RoleNameIndex")
                    .IsUnique()
                    .HasFilter("([NormalizedName] IS NOT NULL)");

                entity.Property(e => e.Id).ValueGeneratedNever();

                entity.Property(e => e.Ipaddress).HasColumnName("IPAddress");

                entity.Property(e => e.Name).HasMaxLength(256);

                entity.Property(e => e.NormalizedName).HasMaxLength(256);
            });

            modelBuilder.Entity<AspNetUserClaims>(entity =>
            {
                entity.HasIndex(e => e.UserId);

                entity.HasOne(d => d.User)
                    .WithMany(p => p.AspNetUserClaims)
                    .HasForeignKey(d => d.UserId);
            });

            modelBuilder.Entity<AspNetUserLogins>(entity =>
            {
                entity.HasKey(e => new { e.LoginProvider, e.ProviderKey });

                entity.HasIndex(e => e.UserId);

                entity.HasOne(d => d.User)
                    .WithMany(p => p.AspNetUserLogins)
                    .HasForeignKey(d => d.UserId);
            });

            modelBuilder.Entity<AspNetUserRoles>(entity =>
            {
                entity.HasKey(e => new { e.UserId, e.RoleId });

                entity.HasIndex(e => e.RoleId);

                entity.HasOne(d => d.Role)
                    .WithMany(p => p.AspNetUserRoles)
                    .HasForeignKey(d => d.RoleId);

                entity.HasOne(d => d.User)
                    .WithMany(p => p.AspNetUserRoles)
                    .HasForeignKey(d => d.UserId);
            });

            modelBuilder.Entity<AspNetUsers>(entity =>
            {
                entity.HasIndex(e => e.NormalizedEmail)
                    .HasName("EmailIndex");

                entity.HasIndex(e => e.NormalizedUserName)
                    .HasName("UserNameIndex")
                    .IsUnique()
                    .HasFilter("([NormalizedUserName] IS NOT NULL)");

                entity.Property(e => e.Id).ValueGeneratedNever();

                entity.Property(e => e.Email).HasMaxLength(256);

                entity.Property(e => e.NormalizedEmail).HasMaxLength(256);

                entity.Property(e => e.NormalizedUserName).HasMaxLength(256);

                entity.Property(e => e.UserName).HasMaxLength(256);
            });

            modelBuilder.Entity<AspNetUserTokens>(entity =>
            {
                entity.HasKey(e => new { e.UserId, e.LoginProvider, e.Name });

                entity.HasOne(d => d.User)
                    .WithMany(p => p.AspNetUserTokens)
                    .HasForeignKey(d => d.UserId);
            });

            modelBuilder.Entity<Clean>(entity =>
            {
                entity.Property(e => e.DateEntered).HasColumnType("datetime");

                entity.Property(e => e.DateUpdated).HasColumnType("datetime");

                entity.Property(e => e.Description).HasMaxLength(512);

                entity.Property(e => e.Name).HasMaxLength(50);
            });

            modelBuilder.Entity<Country>(entity =>
            {
                entity.Property(e => e.DateEntered).HasColumnType("datetime");

                entity.Property(e => e.DateUpdated).HasColumnType("datetime");

                entity.Property(e => e.Description).HasMaxLength(512);

                entity.Property(e => e.Name).HasMaxLength(50);

                entity.Property(e => e.AppleName).HasMaxLength(50);

                entity.Property(e => e.GoogleName).HasMaxLength(50);
            });

            modelBuilder.Entity<PoopLocation>(entity =>
            {
                entity.HasIndex(e => e.AspNetUsersId);

                entity.HasIndex(e => e.PostalCode);

                entity.HasIndex(e => e.ProvinceId);

                entity.Property(e => e.Address1).HasMaxLength(100);

                entity.Property(e => e.Address2).HasMaxLength(100);

                entity.Property(e => e.City).HasMaxLength(100);

                entity.Property(e => e.DateEntered).HasColumnType("datetime");

                entity.Property(e => e.DateUpdated).HasColumnType("datetime");

                entity.Property(e => e.PostalCode).HasMaxLength(50);

                entity.HasOne(d => d.AspNetUsers)
                    .WithMany(p => p.PoopLocation)
                    .HasForeignKey(d => d.AspNetUsersId)
                    .HasConstraintName("FK_PoopLocation_AspNetUsersId");

                entity.HasOne(d => d.Clean)
                    .WithMany(p => p.PoopLocation)
                    .HasForeignKey(d => d.CleanId)
                    .HasConstraintName("FK_PoopLocation_CleanId");

                entity.HasOne(d => d.Province)
                    .WithMany(p => p.PoopLocation)
                    .HasForeignKey(d => d.ProvinceId)
                    .HasConstraintName("FK_PoopLocation_ProvinceId");
            });

            modelBuilder.Entity<Province>(entity =>
            {
                entity.HasIndex(e => e.CountryId);

                entity.Property(e => e.Abbreviation).HasMaxLength(5);

                entity.Property(e => e.AppleName).HasMaxLength(50);

                entity.Property(e => e.DateEntered).HasColumnType("datetime");

                entity.Property(e => e.DateUpdated).HasColumnType("datetime");

                entity.Property(e => e.Description).HasMaxLength(512);

                entity.Property(e => e.GoogleName).HasMaxLength(10);

                entity.Property(e => e.Name).HasMaxLength(50);

                entity.HasOne(d => d.Country)
                    .WithMany(p => p.Province)
                    .HasForeignKey(d => d.CountryId)
                    .HasConstraintName("FK_Province_Country");
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*fer 5

可能是由于您的类AspNetRoleClaims未正确继承引起的IdentityRoleClaim。从通用类TRoleClaim到表,它都有自己的配置AspNetRoleClaims

builder.Entity<TRoleClaim>(b =>
{
    b.HasKey(rc => rc.Id);
    b.ToTable("AspNetRoleClaims");
});
Run Code Online (Sandbox Code Playgroud)

因此,如果没有向构造函数显示正确的类型,它将使用它自己的实现,IdentityRoleClaim该实现与您的AspNetRoleClaims类不同。在这种情况下,您尝试使用不同的类创建相同的表。

要解决此问题,请尝试使用提供所需的所有泛型类型的构造函数:

public partial class PoopTheWorldContext : IdentityDbContext<ApplicationUser, 
    ApplicationRole, Guid, AspNetUserClaims, AspNetUserRoles, AspNetUserLogins, 
    AspNetRoleClaims, AspNetUserTokens>
{
    //your code here
}
Run Code Online (Sandbox Code Playgroud)

你必须做你做同样的继承ApplicationUserApplicationRole对使用Guid中的所有其他类关键。

public class AspNetUserTokens : IdentityUserToken<Guid>{ /*your code here*/ }
public class AspNetRoleClaims : IdentityRoleClaim<Guid>{ /*your code here*/ }
public class AspNetUserLogins : IdentityUserLogin<Guid>{ /*your code here*/ }
public class AspNetUserRoles : IdentityUserRole<Guid>{ /*your code here*/ }
public class AspNetUserClaims : IdentityUserClaim<Guid>{ /*your code here*/ }
Run Code Online (Sandbox Code Playgroud)

最后,除非您希望给它们另一个名称,否则您无需创建所有这些DbSet,因为它们已在基类中声明。例如,AspNetRoleClaims声明为RoleClaims。而且,除此之外,你应该使用DbSet<ApplicationUser> AspNetUsersDbSet<ApplicationRole> AspNetRoles代替DbSet<AspNetRoles> AspNetRolesDbSet<AspNetUsers> AspNetUsers,因为这些是类,您传递的基类。如果不这样做,您将收到试图避免的错误。

如果要查看DbSet声明和表配置:

IdentityDbContext

IdentityUserContext