如何删除dbo.AspNetUserClaims和dbo.AspNetUserLogins表(IdentityUserClaim和IdentityUserLogin实体)?

Sli*_*ght 7 c# asp.net-mvc entity-framework asp.net-identity

我们的应用程序不需要身份使用的过多"登录"和"声明"功能.如果没有在数据库中创建这些表格simlpy会很好,但我不想重新实现所有的身份类...

我假设它是这样的

public ApplicationDbContext : IdentityDbContext
{
        [...]

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Ignore<IdentityUserClaim>();
            modelBuilder.Ignore<IdentityUserLogin>();
        }
}
Run Code Online (Sandbox Code Playgroud)

您会认为这根据功能描述有效,但事实并非如此.在AspNetUserClaimAspNetUserLogins表仍然可以创建.

这样做的正确方法是什么?

Dei*_*lan 13

下面是一个实现ApplicationDbContextOnModelCreating对你的情况的方法.事实上,这只是忽略和实体IdentityDbContextOnModelCreating方法.IdentityUserClaimIdentityUserLogin

请注意,OnModelCreating覆盖不应该调用base.OnModelCreating方法.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Needed to ensure subclasses share the same table
        var user = modelBuilder.Entity<ApplicationUser>()
            .ToTable("AspNetUsers");
        user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
        user.Ignore(u => u.Claims);
        user.Ignore(u => u.Logins);
        user.Property(u => u.UserName)
            .IsRequired()
            .HasMaxLength(256)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UserNameIndex") { IsUnique = true }));

        // CONSIDER: u.Email is Required if set on options?
        user.Property(u => u.Email).HasMaxLength(256);

        modelBuilder.Entity<IdentityUserRole>()
            .HasKey(r => new { r.UserId, r.RoleId })
            .ToTable("AspNetUserRoles");

        var role = modelBuilder.Entity<IdentityRole>()
            .ToTable("AspNetRoles");
        role.Property(r => r.Name)
            .IsRequired()
            .HasMaxLength(256)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("RoleNameIndex") { IsUnique = true }));
        role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId);

        modelBuilder.Ignore<IdentityUserLogin>();
        modelBuilder.Ignore<IdentityUserClaim>();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是相关的代码行:

user.Ignore(u => u.Claims);
user.Ignore(u => u.Logins);
modelBuilder.Ignore<IdentityUserLogin>();
modelBuilder.Ignore<IdentityUserClaim>();
Run Code Online (Sandbox Code Playgroud)

根据需要,它将导致以下迁移而没有dbo.AspNetUserClaimsdbo.AspNetUserLogins表:

CreateTable(
    "dbo.AspNetRoles",
    c => new
        {
            Id = c.String(nullable: false, maxLength: 128),
            Name = c.String(nullable: false, maxLength: 256),
        })
    .PrimaryKey(t => t.Id)
    .Index(t => t.Name, unique: true, name: "RoleNameIndex");

CreateTable(
    "dbo.AspNetUserRoles",
    c => new
        {
            UserId = c.String(nullable: false, maxLength: 128),
            RoleId = c.String(nullable: false, maxLength: 128),
        })
    .PrimaryKey(t => new { t.UserId, t.RoleId })
    .ForeignKey("dbo.AspNetRoles", t => t.RoleId, cascadeDelete: true)
    .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
    .Index(t => t.UserId)
    .Index(t => t.RoleId);

CreateTable(
    "dbo.AspNetUsers",
    c => new
        {
            Id = c.String(nullable: false, maxLength: 128),
            Email = c.String(maxLength: 256),
            EmailConfirmed = c.Boolean(nullable: false),
            PasswordHash = c.String(),
            SecurityStamp = c.String(),
            PhoneNumber = c.String(),
            PhoneNumberConfirmed = c.Boolean(nullable: false),
            TwoFactorEnabled = c.Boolean(nullable: false),
            LockoutEndDateUtc = c.DateTime(),
            LockoutEnabled = c.Boolean(nullable: false),
            AccessFailedCount = c.Int(nullable: false),
            UserName = c.String(nullable: false, maxLength: 256),
        })
    .PrimaryKey(t => t.Id)
    .Index(t => t.UserName, unique: true, name: "UserNameIndex");
Run Code Online (Sandbox Code Playgroud)

  • 当我这样做并尝试注册时,我收到错误消息"类型'ApplicationUser'上的属性'Claims'不是导航属性.Reference和Collection方法只能用于导航属性.使用Property或ComplexProperty方法." 当我调用UserManager.CreateAsync()方法时,任何想法为什么@Deilan (2认同)