【问题标题】:Asp.net identity entity framework database first approach with own table defintionAsp.net 身份实体框架数据库第一种方法与自己的表定义
【发布时间】:2016-08-24 02:37:00
【问题描述】:

我有以下四张桌子

角色表

用户表

用户角色表

用户类型表

默认 Asp.net 身份具有下表,例如 Asp.netusers、Asp.netRoles、Asp.netuserlogins、Asp.netuserclaims、Asp.netuserroles

我的表与相同的列名不匹配,并且某些列在我的表中不可用。我可以使用我自己的表来利用 asp.net 身份的功能,否则我需要将 Asp.netusers 表中使用的相同列跟踪到我的用户表。

这是我的表中必须添加的所有列吗?

我已经使用相同的默认表实现了 asp.net 身份 EF 数据库优先方法。我有单独的角色存储和用户存储

这里的上下文用户,用户角色与asp.net身份(asp.netusers,asp.netroles)中的默认表相同

public partial class OVT_UserEntities : DbContext
    {
        public OVT_UserEntities()
            : base("name=OVT_UserEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<UserClaim> UserClaims { get; set; }
        public virtual DbSet<UserLogin> UserLogins { get; set; }
        public virtual DbSet<UserRole> UserRoles { get; set; }
        public virtual DbSet<User> Users { get; set; }
    }

用户类别:

public partial class User : IUser<int>
    {
    }

角色类:

public partial class UserRole : IRole<int>
    {
    }

现在我想使用上面四个新表(上面的表设计图像)而不是由 asp.net 身份提供的现有表。所以我不确定是否需要在我的数据库中添加相同的所有表和列才能处理 asp.net 身份?

【问题讨论】:

  • 你绝对可以使用自己的表结构
  • @monstertjie_za 你能重定向一些链接或文章来跟进吗?
  • 您希望如何使用您描述的表格?你的桌子和第一组有关系吗?除了使其他人可以在视觉上识别事物之外,列名在任何方面都无关紧要。主要是确保相同的数据类型,然后使用外键约束来确保数据完整性。
  • @gmiley 按问题更新。角色、用户、用户角色表与 asp.netroles、asp.netusers、asp.netuserroles 表相同。但某些列在其中一个表中不可用。我的问题是是否所有的列都像我们必须设计的 asp.net 身份?
  • @gmiley 如果您有任何工作样本或文章具有自己的表格定义会更好地理解?

标签: c# asp.net-mvc asp.net-identity asp.net-identity-2 asp.net-mvc-5


【解决方案1】:

由于您使用的是Microsoft.AspNet.Identity,您应该从IdentityUser(命名空间Microsoft.AspNet.Identity.EntityFramework)继承您的用户。

你的类应该这样定义:

用户

public class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
{
}

角色

public class Role : IdentityRole<int, UserRole>
{
}

用户角色

public class UserRole : IdentityUserRole<int>
{
}

用户声明

public class UserClaim : IdentityUserClaim<int>
{
}

用户登录

public class UserLogin : IdentityUserLogin<int>
{
}

您可以添加自己的自定义列来扩展类:

public class User : IdentityUser<int, UserLogin, UserRole, UserClaim>
{
    public string CompanyName { get; set; }
}

现在您必须定义商店:

public class UserStore:  UserStore<User, Role, int, UserLogin, UserRole, UserClaim>
{
    public UserStore(MyContext context)
        : base(context)
    {
    }
}

然后是你的数据库上下文,继承自IdentityDbContext

public class MyContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
    public MyContext(): base("ConnectionString")
    {

    }
}

在您的数据库上下文 (MyContext) 中,您必须覆盖 OnModelCreating 以便您可以创建列、更改类型、表名等:

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

        modelBuilder.Entity<MyUser>()
            .Property(p => p.Id)
            .HasColumnType("int")
            .IsRequired();

        modelBuilder.Entity<MyRole>()
            .Property(p => p.Id)
            .HasColumnType("int")
            .IsRequired();

        modelBuilder.Entity<MyUserRole>()
            .Property(p => p.RoleId)
            .HasColumnType("int")
            .IsRequired();

        modelBuilder.Entity<MyUserRole>()
            .Property(p => p.UserId)
            .HasColumnType("int")
            .IsRequired();

        modelBuilder.Entity<MyUserClaim>()
            .Property(p => p.Id)
            .HasColumnType("int")
            .IsRequired();

        modelBuilder.Entity<MyUserClaim>()
            .Property(p => p.UserId)
            .HasColumnType("int")
            .IsRequired();

        modelBuilder.Entity<MyUserLogin>()
            .Property(p => p.UserId)
            .HasColumnType("int")
            .IsRequired();

        modelBuilder.Entity<MyUser>()
            .ToTable("Users");

        modelBuilder.Entity<MyRole>()
            .ToTable("Roles");

        modelBuilder.Entity<MyUserRole>()
            .ToTable("UserRoles");

        modelBuilder.Entity<MyUserClaim>()
            .ToTable("UserClaims");

        modelBuilder.Entity<MyUserLogin>()
            .ToTable("UserLogins");

    }

现在您可以使用migrationsgenerate 您的表格。

我已更新 github project 以反映您的情况。

更新

如果您想自定义列的名称和类型,您只需给它们一个名称:

modelBuilder.Entity<User>()
    .Property(p => p.Id)
    .HasColumnName("user_id")
    .HasColumnType("SMALLINT")
    .IsRequired();

【讨论】:

  • 您是否使用数据库优先方法?我的用户表没有“id”列作为 int,而是具有不同数据类型的 user_id,而且我现在还没有 userlogin 和 userclaims 表。是否需要所有列的所有四个表都需要使用标识
  • 我可以将“覆盖 OnModelCreating”与“DB first”方法一起使用吗? (不使用 edmx,我自己创建模型和 DbContext 类)
  • @java-love:当然可以。您可以自己创建数据库和表并将结构映射到OnModelCreating。但是,您必须在基本模型中定义默认字段。
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多