Asp.net身份实体框架数据库首先采用自己的表定义方法

时间:2016-04-29 04:48:40

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

我有四张桌子

角色表

enter image description here

用户表

enter image description here

UserRole表

enter image description here

UserType表

enter image description here

默认Asp.net标识下面有Asp.netusers,Asp.netRoles,Asp.netuserlogins,Asp.netuserclaims,Asp.netuserroles

等表格

我的表格不匹配相同的列名称和我的表格中没有的某些列。我可以使用自己的表来利用asp.net标识的功能,否则我需要按照Asp.netusers表中使用的相同列到我的用户表。

是否需要在我的表格中添加所有列?

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

下面这里的用户,userroles与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身份?

1 个答案:

答案 0 :(得分:2)

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

你的课程应该这样定义:

用户

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

<强>作用

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

用户-ROLE

public class UserRole : IdentityUserRole<int>
{
}

用户-CLAIM

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();

enter image description here