Asp.net mvc 带有.Net 4.7 MVC标识问题的实体框架核心
我正在寻找取代EF6与EF核心在一个项目中,我刚刚开始建设 我面临的问题是,目前我正在从IdentityDbContext继承我的上下文,就像使用Identity一样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
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以避免混淆