带有.Net 4.7 MVC身份问题的实体框架核心

时间:2018-06-28 21:51:37

标签: asp.net-mvc asp.net-identity entity-framework-core asp.net-identity-3

我希望在我刚刚开始构建的项目中用EF Core替换EF6。

我面临的问题是当前我正在像使用Identity这样从IdentityDbContext继承我的Context。

public partial class MyContext : IdentityDbContext<ApplicationUser>

移动到EF Core要求我使用Identity Core。在我的数据访问层中这很好,因为我可以只引用Microsoft.AspNetCore.Identity.EntityFrameworkCore。

我发现的真正问题是,当我试图在我的MVC .Net 4.7应用程序中使用它时,Identity Core不能工作,因为它不是.Net Core。

那么我最好的选择就是将Identity拆分为自己的上下文,还是有一种方法可以通过使用非Identity Core继承IdentityContext来使用EF Core?

或者我把杆子完全弄错了...

谢谢

1 个答案:

答案 0 :(得分:0)

我刚才要做的是直接从IdentityDbContext重新实现功能到我的DbContext +提供的用户存储。确实没有涉及魔术。 IdentityDbContext唯一要做的就是向您的上下文添加一些数据集和一些映射。

您可以在这里找到所需的一切:https://github.com/aspnet/AspNetIdentity/tree/master/src/Microsoft.AspNet.Identity.EntityFramework

我们正在使用Guid作为Ids,因为我们已经有了自CustomUserLogin继承的自定义类,例如IdentityUserLogin,所以我只是将所有内容从基类移入了该类。

您会看到的一件事是,旧代码在两个方向上都没有适当的导航属性。我添加了它,这样就可以像这样映射:

    private void SetupIdentityTables(ModelBuilder modelBuilder)
    {
        var user = modelBuilder.Entity<ApplicationUser>()
            .ToTable("AspNetUsers");
        user.HasMany(u => u.Roles).WithOne().HasForeignKey(ur => ur.UserId);
        user.HasMany(u => u.Claims).WithOne().HasForeignKey(uc => uc.UserId);
        user.HasMany(u => u.Logins).WithOne().HasForeignKey(ul => ul.UserId);
        user.Property(u => u.UserName)
            .IsRequired()
            .HasMaxLength(256);
        user.HasIndex(x => x.UserName).HasName("UserNameIndex").IsUnique();

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

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

        modelBuilder.Entity<CustomUserLogin>()
            .ToTable("AspNetUserLogins")
            .HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId });

        modelBuilder.Entity<CustomUserClaim>()
            .ToTable("AspNetUserClaims");

        var role = modelBuilder.Entity<CustomRole>()
            .ToTable("AspNetRoles");
        role.Property(r => r.Name)
            .IsRequired()
            .HasMaxLength(256);
        role.HasIndex(x => x.Name).HasName("RoleNameIndex").IsUnique();
        role.HasMany(r => r.Users).WithOne().HasForeignKey(ur => ur.RoleId);
    }

注意:该代码实际上存在某些外键问题,因此无法正常工作。我将需要再看一下这些映射,但是至少应该了解一下。