【问题标题】:Custom Identity User MVC 5 generates two user tablesCustom Identity User MVC 5 生成两个用户表
【发布时间】:2015-03-26 08:07:50
【问题描述】:

我正在尝试自定义我的 IdentityUser 以将主键生成为整数并更改表名。 问题是:正确生成了主键,并且所有标准表都是由迁移正确创建的,使用新名称,但用户除外。当我应用 Add-Migration 命令时,它会返回两个“用户表”。

这是我的代码。

我的自定义身份类

public class User : IdentityUser<int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
}
public class CustomUserRole : IdentityUserRole<int> { }
public class CustomUserClaim : IdentityUserClaim<int> { }
public class CustomUserLogin : IdentityUserLogin<int> { }

public class CustomRole : IdentityRole<int, CustomUserRole>
{
    public CustomRole() { }
    public CustomRole(string name) { Name = name; }
}

我的 ApplicationDbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, int, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    public ApplicationDbContext() : base("CONNSTRING") { }


    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

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

        modelBuilder.Entity<User>().ToTable("Users", "dbo");
        modelBuilder.Entity<CustomRole>().ToTable("Role","dbo");
        modelBuilder.Entity<CustomUserRole>().ToTable("UserRole", "dbo");
        modelBuilder.Entity<CustomUserLogin>().ToTable("UserLogin", "dbo");
        modelBuilder.Entity<CustomUserClaim>().ToTable("UserClaims", "dbo");


    }
}

EF 生成的脚本,你可以看到生成了两个“用户表”:标准的一个“AspNetUsers”和我的自定义一个“用户”。

 public partial class teste : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.Role",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(nullable: false, maxLength: 256),
                    })
                .PrimaryKey(t => t.Id)
                .Index(t => t.Name, unique: true, name: "RoleNameIndex");

            CreateTable(
                "dbo.UserRole",
                c => new
                    {
                        UserId = c.Int(nullable: false),
                        RoleId = c.Int(nullable: false),
                    })
                .PrimaryKey(t => new { t.UserId, t.RoleId })
                .ForeignKey("dbo.Role", t => t.RoleId, cascadeDelete: true)
                .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                .ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true)
                .Index(t => t.UserId)
                .Index(t => t.RoleId);

            CreateTable(
                "dbo.AspNetUsers",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        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");

            CreateTable(
                "dbo.UserClaims",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        UserId = c.Int(nullable: false),
                        ClaimType = c.String(),
                        ClaimValue = c.String(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                .ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true)
                .Index(t => t.UserId);

            CreateTable(
                "dbo.UserLogin",
                c => new
                    {
                        LoginProvider = c.String(nullable: false, maxLength: 128),
                        ProviderKey = c.String(nullable: false, maxLength: 128),
                        UserId = c.Int(nullable: false),
                    })
                .PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId })
                .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
                .ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true)
                .Index(t => t.UserId);

            CreateTable(
                "dbo.Users",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Email = c.String(),
                        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(),
                    })
                .PrimaryKey(t => t.Id);

        }

        public override void Down()
        {
            DropForeignKey("dbo.UserRole", "UserId", "dbo.Users");
            DropForeignKey("dbo.UserLogin", "UserId", "dbo.Users");
            DropForeignKey("dbo.UserClaims", "UserId", "dbo.Users");
            DropForeignKey("dbo.UserRole", "UserId", "dbo.AspNetUsers");
            DropForeignKey("dbo.UserLogin", "UserId", "dbo.AspNetUsers");
            DropForeignKey("dbo.UserClaims", "UserId", "dbo.AspNetUsers");
            DropForeignKey("dbo.UserRole", "RoleId", "dbo.Role");
            DropIndex("dbo.UserLogin", new[] { "UserId" });
            DropIndex("dbo.UserClaims", new[] { "UserId" });
            DropIndex("dbo.AspNetUsers", "UserNameIndex");
            DropIndex("dbo.UserRole", new[] { "RoleId" });
            DropIndex("dbo.UserRole", new[] { "UserId" });
            DropIndex("dbo.Role", "RoleNameIndex");
            DropTable("dbo.Users");
            DropTable("dbo.UserLogin");
            DropTable("dbo.UserClaims");
            DropTable("dbo.AspNetUsers");
            DropTable("dbo.UserRole");
            DropTable("dbo.Role");
        }
    }

附加信息: 该应用程序使用“AspNetUsers”表作为主体。

感谢您的帮助。

【问题讨论】:

    标签: entity-framework ef-code-first asp.net-mvc-5 asp.net-identity


    【解决方案1】:

    我认为您必须像这样在 OnModelCreating 方法中将 IdentityUser 映射到您的新用户表。

    modelBuilder.Entity<IdentityUser>()
                            .ToTable("Users", "dbo").Property(p => p.Id).HasColumnName("UserId");
    

    【讨论】:

    • 我试过这个,但没有用,如果我应用这个解决方案,我会收到错误:modelBuilder.Entity().ToTable("Users", "dbo" ).Property(p => p.Id).HasColumnName("UserId"); //modelBuilder.Entity().ToTable("Users", "dbo"); modelBuilder.Entity().ToTable("Role","dbo"); modelBuilder.Entity().ToTable("UserRole", "dbo"); modelBuilder.Entity().ToTable("UserLogin", "dbo"); modelBuilder.Entity().ToTable("UserClaims", "dbo");
    • Repository.Migration.DbContext.IdentityUserLogin: : EntityType 'IdentityUserLogin' 没有定义键。定义此 EntityType 的键。 Repository.Migration.DbContext.IdentityUserRole: : EntityType 'IdentityUserRole' 没有定义键。定义此 EntityType 的键。 IdentityUserLogins:EntityType:EntitySet 'IdentityUserLogins' 基于没有定义键的类型'IdentityUserLogin'。 IdentityUserRoles:EntityType:EntitySet 'IdentityUserRoles' 基于没有定义键的类型'IdentityUserRole'。
    • 尝试将这些实体(IdentityUserRole、IdentityUserRole)也映射到您的自定义表中。
    • 你的意思是用户ID?我不明白为什么只有用户表在重复
    • 我发现了我的错误。我有其他名为 ApplicationUser 的类继承了 IdentityUser,所以我将 User 类转换为表 User,而 ApplicationUser 类正在转换为 AspNetUser 表!
    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2019-05-01
    • 2013-11-10
    • 2015-02-01
    相关资源
    最近更新 更多