webentwicklung-frage-antwort-db.com.de

InvalidOperationException: DbSet für 'Role' kann nicht erstellt werden, da dieser Typ für den Kontext nicht im Modell enthalten ist

Die folgende Lösung funktioniert in .net Core 1.1, aber nach einem Upgrade von 1.1 auf 2.0 wurde die folgende Fehlermeldung angezeigt:

InvalidOperationException: Es kann kein DbSet für 'Role' erstellt werden, da dieser Typ für den Kontext nicht im Modell enthalten ist.

Wenn der Benutzer versucht, sich anzumelden, und die folgende Anweisung ausgeführt wird:

var result = await _signInManager.PasswordSignInAsync(model.Email, 
                                model.Password, model.RememberMe, lockoutOnFailure: false);

Was ist falsch?


User.cs

public partial class User : IdentityUser<Guid>
{
    public string Name { get; set; }
}

IdentityEntities.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>
{
}

ConfigureServices

services.AddIdentity<User, Role> 
17
001

Dies hinzugefügt und es hat funktioniert:

builder.Entity<IdentityUserRole<Guid>>().HasKey(p => new { p.UserId, p.RoleId });
10
001

Die häufigsten Gründe für 

Es kann kein DbSet für 'THE-MODEL' erstellt werden, da dieser Typ nicht .__ ist. im Modell für den Kontext enthalten

sind wie folgt

  1. Der Modellname stimmt nicht mit dem Tabellennamen in der Datenbank überein 
  2. EntityFramework kann die erforderliche Meta nicht durch Konventionen ermitteln und Sie haben Nicht überschrieben.

in Ihrem Fall erbt die Rolle IdentityRoleClaim, und das war nicht konfiguriert. Für die Standardkonvention war "Id" als Schlüssel erforderlich. Ich vermute jedoch, dass diese Eigenschaft nicht vorhanden war. Es hätte auch funktioniert, wenn Sie in Role eine Eigenschaft wie Id => new {UserId, RoleId} erstellt hätten, die Id normalerweise als Schlüsseleigenschaft für das Entity-Framework darstellen würde.

6
Gurpreet

Stellen Sie sicher, dass Ihre AppDbContext NICHT von DbContext geerbt wird, sondern stattdessen von IdentityDbContext<ApplicationUser>.

6
MaylorTaylor

Ich habe das behoben, indem ich Folgendes hinzufügte:

public DbSet<ApplicationRole> ApplicationRoles { get; set; }

zu meinem DbContext.

1
Simon Morgan

Wenn Ihr DbContext IdentityUserContext nicht erbt, verwenden Sie AddEntityFrameworkStores nicht in der ConfigureServices-Methode. Ersetzen Sie es mit AddUserStore und AddRoleStore wie folgt: 

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>>();
    ...
}

Wenn Sie die Implementierung der AddEntityFrameworkStores-Methode überprüfen, werden Sie feststellen, dass durch das Suchen nach generischen Typen im DbContext Speicher hinzugefügt wird, vorausgesetzt, dass sie IdentityUserContext erbt. Unabhängig davon bleiben Sie bei den Basisidentitätstypen * für Ansprüche ..., die diese Ausnahme generieren.

1
frontlinebg

Fügen Sie Ihre Modelle mit Model Builder in den DBContext ein. Schreiben Sie Ihre DB Context-Klasse wie folgt.

 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>();            
    }
0
Saurabh Raoot

In meinem Fall geschah dies, weil ich Entitäten manuell hinzugefügt habe und vergessen habe, die nächste unter DbContext hinzuzufügen. 

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    new CryptoCoinsMap(modelBuilder.Entity<CoinMaster>());
    new CoinQuotesDailyMap(modelBuilder.Entity<CoinQuotesDaily>());
}
0
Patrick

Ich hatte das ähnliche Problem, dies war von der fehlerhaften Konfiguration für IUserStore in meinem Fall. Ich benutze Autofac für die Abhängigkeitsinjektion und diese Konfiguration hat mein Problem gelöst:

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();

Meine databaseContext-Laufwerke von IdentityDbContext

 public class DatabaseContext : IdentityDbContext<User, Role, Guid, UserClaim
    , UsersInRole, UserLogin, RoleClaim, UserToken
    >, IDatabaseContext

und alles, was ich tun musste, war, einen Userstore zu erstellen und es meinem DI zu geben, in die signinmanager-Klasse zu springen