我希望在刚刚开始构建的项目中将 EF6 替换为 EF Core。
我面临的问题是,目前我正在使用 Identity 从 IdentityDbContext 继承我的上下文,就像使用 Identity 一样。
public partial class MyContext : IdentityDbContext<ApplicationUser>
迁移到 EF Core 需要我使用标识核心。这在我的数据访问层中很好,因为我可以引用Microsoft.AspNetCore.Identity.EntityFrameworkCore。
我发现的真正问题是当我尝试在我的MVC .Net 4.7应用程序中使用它时,身份核心将无法工作,因为它不是.Net Core。
那么,我的最佳选择是将标识拆分到其自己的上下文中,还是有没有办法通过使用非标识核心继承标识上下文来像现在一样使用 EF Core?
还是我完全弄错了棍子的一端...
谢谢
我刚刚做的是重新实现从IdentityDbContext的功能直接到我的DbContext +提供的用户存储。真的没有魔法。IdentityDbContext 唯一要做的就是向上下文中添加一些数据集和一些映射。
您可以在这里找到所需的一切:https://github.com/aspnet/AspNetIdentity/tree/master/src/Microsoft.AspNet.Identity.EntityFramework
我们使用 Guid 作为 ID,我们已经有了自定义类,例如从IdentityUserLogin
继承的CustomUserLogin
类,所以我只是将所有内容从基类移动到该类中。
您将看到的一件事是旧代码在两个方向上都没有适当的导航属性。我添加了这个,以便我可以像这样映射到映射中:
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);
}
注意:此代码实际上不能正常工作,因为它存在一些外键问题。我需要再看看映射,但你至少应该明白这个想法。