如何使用 int ID 列更改 ASP.net 标识 2.0 的表名

本文关键字:标识 net ASP int 何使用 ID | 更新日期: 2023-09-27 17:56:29

我已经使用 ASP.net 会员资格多年,并且刚刚开始尝试 ASP.net 身份。他们刚刚发布了 2.0 版,应该支持int主键。我已按如下方式定义自定义标识类,以便获得整数主键支持:

public class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
{  
}
public class UserLogin : IdentityUserLogin<int>
{
}
public class Role : IdentityRole<int, UserRole>
{
    public string Description { get; set; }  // Custom description field on roles
}
public class UserRole : IdentityUserRole<int>
{
}
public class UserClaim : IdentityUserClaim<int>
{
}
public class MyDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
    public MyDbContext() : this("MyDB") { }
    public MyDbContext(string connStringName) : base(connStringName)
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().ToTable("Users");
        modelBuilder.Entity<Role>().ToTable("Roles");
        modelBuilder.Entity<UserRole>().ToTable("UserRoles");
        modelBuilder.Entity<UserLogin>().ToTable("UserLogins");
        modelBuilder.Entity<UserClaim>().ToTable("UserClaims");
        base.OnModelCreating(modelBuilder);
    }
}

当我创建数据库迁移时,它会为每个标识表正确创建一个整数 Id 列,但是,它会忽略我在 OnModelCreating 方法中指定的自定义表名。相反,我得到像dbo.AspNetUsersdbo.AspNetRoles这样的表名。

我还尝试将[Table("TableName")]添加到我的自定义标识类中,但它不起作用。

在查看 ASP.net Identity 1.0 的示例时,看起来他们使用基本 Identity 类重复了modelBuilder.Entry<Type>().ToTable("TableName")的每一行:

modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<IdentityUser<int, IdentityUserLogin<int>, IdentityUserRole<int>, IdentityUserClaim<int>>>().ToTable("Users");
modelBuilder.Entity<Role>().ToTable("Roles");
modelBuilder.Entity<IdentityRole<int, UserRole>>().ToTable("Roles");
modelBuilder.Entity<UserRole>().ToTable("UserRoles");
modelBuilder.Entity<IdentityUserRole<int>>().ToTable("UserRoles");
modelBuilder.Entity<UserLogin>().ToTable("UserLogins");
modelBuilder.Entity<IdentityUserLogin<int>>().ToTable("UserLogins");
modelBuilder.Entity<UserClaim>().ToTable("UserClaims");
modelBuilder.Entity<IdentityUserClaim<int>>().ToTable("UserClaims");

但是,我尝试了几种变体,但我的迁移不会生成。我一直收到类似于类型Microsoft.AspNet.Identity.EntityFramework.IdentityUser'4[System.Int32,Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin'1[System.Int32],Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole'1[System.Int32],Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim'1[System.Int32]]"的错误。检查是否未通过使用 Ignore 方法或 NotMappedAttribute 数据批注显式排除该类型。验证该类型是否定义为类,不是基元或泛型,并且不是从 EntityObject 继承的。

如何在 ASP.net Identity 2.0 中生成具有整数主键的自定义表名?

如何使用 int ID 列更改 ASP.net 标识 2.0 的表名

Grrr...因此,在浪费了几个小时之后,我复制了我的规则并将它们粘贴到base.OnModelCreating(modelBuilder);行下方,一切正常。我没有意识到需要首先调用基本方法:(

现在使用以下配置一切正常:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder); // This needs to go before the other rules!
    modelBuilder.Entity<User>().ToTable("Users");
    modelBuilder.Entity<Role>().ToTable("Roles");
    modelBuilder.Entity<UserRole>().ToTable("UserRoles");
    modelBuilder.Entity<UserLogin>().ToTable("UserLogins");
    modelBuilder.Entity<UserClaim>().ToTable("UserClaims");
}

在 IdentityModel.cs 文件中,我将以下代码添加到 ApplicationDbContext

请注意,模型名称与接受答案中列出的名称不同

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<ApplicationUser>().ToTable("SystemUsers");
        modelBuilder.Entity<IdentityRole>().ToTable("SystemRoles");
        modelBuilder.Entity<IdentityUserRole>().ToTable("SystemUserRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("SystemUserLogins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("SystemUserClaims");
    }