asp.net-mvc - Entity Framework Core 与 .Net 4.7 MVC 身份问题

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

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

我面临的问题是,目前我正在从 IdentityDbContext 继承我的上下文,就像使用 Identity 一样。

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?

还是我的想法完全错误...

谢谢

最佳答案

我刚刚所做的是将 IdentityDbContext 中的功能直接重新实现到我的 DbContext + 提供的用户存储中。真的没有魔法。 IdentityDbContext 所做的唯一一件事就是将一些数据集和一些映射添加到您的上下文中。

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

我们使用 Guid 作为 ID,因为我们已经有了自定义类,例如 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);
    }

注意:这段代码实际上并不能很好地工作,因为它有一些外键问题。我需要再看一下映射,但您至少应该明白了。

关于asp.net-mvc - Entity Framework Core 与 .Net 4.7 MVC 身份问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51091677/

相关文章:

asp.net-mvc - Sitecore MVC渲染类型说明

c# - 将 Claims 添加到 ApplicationUser 的子类

c# - 具有 2 个前端应用程序(Blazor Server 和 Angular)的项目的建议架构,包括 EFCore、Identity、Mediatr

C# Entity Framework Core - LINQ 检查一个数组在另一个数组中是否存在

asp.net-core-mvc - ASP.Net Core 类库的 Entity Framework Core 迁移

asp.net-mvc - 如何使用 ASP.net MVC 实现动态面包屑?

asp.net - 将 ASP.NET MVC5 身份验证添加到现有项目

asp.net - 如何从 ASP.NET Identity 获取用户列表?

c# - 如何使用 Entity Framework Core 功能来更改我的数据库?

c# - ASP.NET MVC 6 Controller 工厂