Asp.net mvc 带有.Net 4.7 MVC标识问题的实体框架核心

Asp.net mvc 带有.Net 4.7 MVC标识问题的实体框架核心,asp.net-mvc,asp.net-identity,entity-framework-core,asp.net-identity-3,Asp.net Mvc,Asp.net Identity,Entity Framework Core,Asp.net Identity 3,我正在寻找取代EF6与EF核心在一个项目中,我刚刚开始建设 我面临的问题是,目前我正在从IdentityDbContext继承我的上下文,就像使用Identity一样 public partial class MyContext : IdentityDbContext<ApplicationUser> 公共部分类MyContext:IdentityDbContext 移动到EF Core需要使用Identity Core。这在我的数据访问层很好,因为我可以只引用Microsoft

我正在寻找取代EF6与EF核心在一个项目中,我刚刚开始建设

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

public partial class MyContext : IdentityDbContext<ApplicationUser>
公共部分类MyContext:IdentityDbContext 移动到EF Core需要使用Identity Core。这在我的数据访问层很好,因为我可以只引用Microsoft.AspNetCore.Identity.EntityFrameworkCore

我发现的真正问题是在我的MVC.NET4.7应用程序中尝试使用它时,Identity Core无法工作,因为它不是.NETCore

那么,我最好的选择是将Identity拆分为自己的上下文,还是有一种方法可以像我现在这样使用efcore,通过使用非Identity Core继承IdentityContext

还是我把棍子的一端搞错了


谢谢

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

您可以在这里找到所需的一切:

我们使用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);
    }
private void SetupIdentityTables(ModelBuilder ModelBuilder)
{
var user=modelBuilder.Entity()
.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();
//考虑:如果设置了选项,则需要发送电子邮件?
user.Property(u=>u.Email).HasMaxLength(256);
modelBuilder.Entity()
.ToTable(“AspNetUserRoles”)
.HasKey(r=>new{r.UserId,r.RoleId});
modelBuilder.Entity()
.ToTable(“AspNetUserLogins”)
.HasKey(l=>new{l.LoginProvider,l.ProviderKey,l.UserId});
modelBuilder.Entity()
.ToTable(“AspNetUserClaims”);
var role=modelBuilder.Entity()
.ToTable(“AspNetRoles”);
属性(r=>r.Name)
.IsRequired()
.HasMaxLength(256);
role.HasIndex(x=>x.Name).HasName(“RoleNameIndex”).IsUnique();
role.HasMany(r=>r.Users).WithOne().HasForeignKey(ur=>ur.RoleId);
}

注意:这段代码实际上工作得并不完美,因为它有一些外键问题。我需要再看一看映射,但你至少应该明白这一点。

Huh,你的意思不是升级到Identity4吗?我已经澄清了,只是指定Identity Core以避免混淆