InvalidOperationException:无法为"角色"创建数据库集,因为此类型未包含在上下文的模型中



以下解决方案适用于 .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>

div class="ans>

添加了这个,它起作用了:

builder.Entity<IdentityUserRole<Guid>>().HasKey(p => new { p.UserId, p.RoleId });
最常见的

原因

无法为"模型"创建数据库集,因为此类型不是 包含在上下文的模型中

具体如下

  1. 模型名称与数据库中的表名称不匹配
  2. 实体框架无法按照惯例找出所需的元,而你有不覆盖它。

在您的情况下,角色继承了 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.

我遇到了同样的问题,我发现我没有将其包含在RoleStoreUserStore中因此,您需要执行以下操作在应用程序数据库上下文中

public class ApplicationDbContext: IdentityDbContext<User, Role, GUID, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
{}

您需要在商店中添加角色,用户角色,如下所示:

  1. 创建一个从角色存储继承的类,如下所示

    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的课程。

  1. 您需要检查您的 AppDbContext 是否继承自 IdentityDbContext。您的 AppDbContext 必须继承自 IdentityDbContext。

  2. 然后 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();
         });
    
  3. 整体应用程序 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);
    }
} 

最新更新