以下解决方案适用于 .net core 1.1,但在从 1.1 升级到 2.0 后,我收到以下错误:
InvalidOperationException:无法为"角色"创建 DbSet,因为此类型未包含在上下文的模型中。
当用户尝试登录并执行以下语句时:
var result = await _signInManager.PasswordSignInAsync(model.Email,
model.Password, model.RememberMe, lockoutOnFailure: false);
怎么了?
用户.cs
public partial class User : IdentityUser<Guid>
{
public string Name { get; set; }
}
标识实体.cs
public partial class UserLogin : IdentityUserLogin<Guid>
{
}
public partial class UserRole : IdentityUserRole<Guid>
{
}
public partial class UserClaim : IdentityUserClaim<Guid>
{
}
public partial class Role : IdentityRole<Guid>
{
public Role() : base()
{
}
public Role(string roleName)
{
Name = roleName;
}
}
public partial class RoleClaim : IdentityRoleClaim<Guid>
{
}
public partial class UserToken : IdentityUserToken<Guid>
{
}
配置服务
services.AddIdentity<User, Role>
检查您的AppDbContext
是否不是从DbContext
继承的,而是应该从IdentityDbContext<ApplicationUser>
继承的<</p>
添加了这个,它起作用了:
builder.Entity<IdentityUserRole<Guid>>().HasKey(p => new { p.UserId, p.RoleId });
原因
无法为"模型"创建数据库集,因为此类型不是 包含在上下文的模型中
具体如下
- 模型名称与数据库中的表名称不匹配
- 实体框架无法按照惯例找出所需的元,而你有不覆盖它。
在您的情况下,角色继承了 IdentityRoleClaim,并且未配置并且默认约定需要"Id"作为键,但我想它没有该属性,因此必须对其进行配置。如果您在角色中创建属性(如 Id => new{UserId,RoleId}),按照惯例,它将 Id 作为实体框架的键属性,这也将起作用。
您可以通过替换此内容来解决此问题
public class ApplicationDbContext : IdentityDbContext<AppUser>
有了这个
public class ApplicationDbContext : IdentityDbContext<AppUser, AppRole, string>
请注意最后一个参数中的此字符串类型。
如果您的 DbContext 不继承 IdentityUserContext - 请不要在 ConfigureServices 方法中使用 AddEntityFrameworkStores。将其替换为 AddUserStore 和 AddRoleStore,如下所示:
public void ConfigureServices(IServiceCollection services)
{
...
services
.AddIdentity<MyUserType, MyRoleType>(...)
.AddUserStore<UserStore<MyUserType, MyRoleType, MyDbContextType, MyKeyType, MyUserClaimType, MyUserRoleType, MyUserLoginType, MyUserTokenType, MyRoleClaimType>>()
.AddRoleStore<RoleStore<MyRoleType, MyDbContextType, MyKeyType, MyUserRoleType, MyRoleClaimType>>();
...
}
如果您检查 AddEntityFrameworkStores 方法的实现,您将看到它通过在 DbContext 中搜索泛型类型来添加存储,假设它继承了 IdentityUserContext。无论如何,您都将坚持使用声明的基本身份*类型...这将生成此异常。
我通过添加以下内容来解决此问题:
public DbSet<ApplicationRole> ApplicationRoles { get; set; }
到我的DbContext
.
我遇到了同样的问题,我发现我没有将其包含在RoleStore
和UserStore
中因此,您需要执行以下操作在应用程序数据库上下文中
public class ApplicationDbContext: IdentityDbContext<User, Role, GUID, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
{}
您需要在商店中添加角色,用户角色,如下所示:
创建一个从角色存储继承的类,如下所示
public class AppRoleStore : RoleStore<Role, ApplicaitonDbContext, GUID, UserRole, RoleClaim>{}
2)为用户存储创建类,如下所示
public class AppUserStore : UserStore<User, Role, ApplicationDbContext, GUID, UserClaim, UserRole, UserLogin, UserToken, RoleClaim>
{}
我遇到了类似的问题,这是我的情况下来自IUserStore的错误配置。我正在使用 Autofac 进行依赖注入,此配置解决了我的问题:
var dbContextParameter = new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(IdentityDbContext),
(pi, ctx) => ctx.Resolve<DatabaseContext>());
builder.RegisterType<UserStore<User, Role, DatabaseContext, Guid,UserClaim,UsersInRole,UserLogin,UserToken,RoleClaim>>()
.As<IUserStore<User>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();
builder.RegisterType<CustomRoleStore>()
//RegisterType<UserStore<User, Role, DatabaseContext, Guid,UserClaim,UsersInRole,UserLogin,UserToken,RoleClaim>>()
.As<IRoleStore<Role>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();
我的数据库上下文驱动器来自 IdentityDbContext
public class DatabaseContext : IdentityDbContext<User, Role, Guid, UserClaim
, UsersInRole, UserLogin, RoleClaim, UserToken
>, IDatabaseContext
我所要做的就是创建一个用户商店并将其提供给我的 DI 以注入到登录管理器类中
使用模型生成器在 DBContext 中添加模型。按如下所示编写数据库上下文类。
public partial class CDBContext : DbContext
{
public CDBContext (string ConnectionString) : base(new DbContextOptionsBuilder().UseSqlServer(ConnectionString).Options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Query<MediaData>();
}
就我而言,我把错误的类传递给了EF DbContext。我有2节课,第一节"Accounting"
,第二节"Account"
。我发送了"会计",EF-Dbcontext没有实体并返回
Cannot create a DbSet for 'Accounting' because this type is not included in the model for the context.
请检查您要发送给DbContext
的课程。
您需要检查您的 AppDbContext 是否继承自 IdentityDbContext。您的 AppDbContext 必须继承自 IdentityDbContext。
然后 OnModel创建您需要映射如下所示的关系 -
builder.Entity<ApplicationUserRole>(userRole => { userRole.HasKey(ur => new { ur.UserId, ur.RoleId }); userRole.HasOne(ur => ur.Role) .WithMany(r => r.UserRoles) .HasForeignKey(ur => ur.RoleId) .IsRequired(); userRole.HasOne(ur => ur.User) .WithMany(r => r.UserRoles) .HasForeignKey(ur => ur.UserId) .IsRequired(); });
整体应用程序 Db 上下文将如下所示 -
using Core.Entities.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Infrastructure.Identity { public class AppIdentityDbContext : IdentityDbContext<AppUser, ApplicationRole, string, IdentityUserClaim<string>, ApplicationUserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>> { public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<ApplicationUserRole>(userRole => { userRole.HasKey(ur => new { ur.UserId, ur.RoleId }); userRole.HasOne(ur => ur.Role) .WithMany(r => r.UserRoles) .HasForeignKey(ur => ur.RoleId) .IsRequired(); userRole.HasOne(ur => ur.User) .WithMany(r => r.UserRoles) .HasForeignKey(ur => ur.UserId) .IsRequired(); }); } } }
希望您的问题能解决。
我也有这个错误,在这里使用 EF Core 5.0 和 EF Core 6.0 让它工作的指南:
https://stackoverflow.com/a/71321924/3850405
这个问题。 我正在调用一个存储过程,并按名称传回一个与表结构根本不对应的标量值:
result = db.Set<*Object*>()
.FromSqlRaw($"EXECUTE [dbo].[*StoredProcedure*] {*var*}")
.AsEnumerable()
.First().*ScalarValueFromProcedure*;
对象名称与表 DbSet 名称不同。 它最初有效,但在此过程中不知何故破裂了。 创建 DbSet<<em>对象>修复了它。
我遇到了这个问题。为了修复它,我在实体配置类中进行了一些更改。
public class AspNetUserClaimsConfig : IEntityTypeConfiguration<IdentityUserClaim<string>>
{
public void Configure(EntityTypeBuilder<IdentityUserClaim<string>> builder)
{
builder.ToTable("AspNetUserClaims", "Identity");
// Primary key
builder.HasKey(uc => uc.Id);
}
}
在我的上下文中,我这样做了:
public class IdentityContext : DbContext
{
public IdentityContext(DbContextOptions<IdentityContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new ApplicationUsersConfig());
base.OnModelCreating(modelBuilder);
}
}