web-dev-qa-db-ja.com

InvalidOperationException:このタイプはコンテキストのモデルに含まれていないため、「ロール」のDbSetを作成できません

次のソリューションは.netコア1.1で機能しますが、1.1から2.0にアップグレードした後、次のエラーを受け取りました。

InvalidOperationException:このタイプはコンテキストのモデルに含まれていないため、「ロール」のDbSetを作成できません。

ユーザーがログインしようとすると、次のステートメントが実行されます。

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

なにが問題ですか?


ser.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> 
24
001

これを追加して機能しました:

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

最も一般的な理由

「THE-MODEL」のDbSetを作成できません。このタイプはコンテキストのモデルに含まれていないためです

以下の通り

  1. モデル名がデータベース内のテーブル名と一致しません
  2. EntityFrameworkは慣例により必要なメタを把握できず、ユーザーはそれをオーバーライドしていません。

あなたの場合、RoleはIdentityRoleClaimを継承し、それは設定されておらず、デフォルトの規則はキーとして「Id」を必要としましたが、そのプロパティがなかったため、設定する必要がありました。 Id => new {UserId、RoleId}のようなロールでプロパティを作成し、慣例によりエンティティフレームワークのキープロパティとしてIDを提示する場合にも機能します。

9
Gurpreet

AppDbContextDbContextから継承されていないことを確認しますが、代わりにIdentityDbContext<ApplicationUser>から継承する必要があります。

6
MaylorTaylor

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を継承すると仮定します)。とにかく、この例外を生成するクレームの基本的なIdentity *タイプにこだわるでしょう。

2
frontlinebg

以下を追加して修正しました:

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

私のDbContextに。

1
Simon Morgan

モデルビルダーを使用して、DBContextにモデルを追加します。以下のようにDB Contextクラスを記述します。

 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

私の場合、これはエンティティを手動で追加し、DbContextの下に次のエンティティを追加するのを忘れていたために発生していました。

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

私は同様の問題を抱えていました。これは私の場合、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();

私のdatabaseContextはIdentityDbContextから駆動します

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

そして、私がしなければならなかったことは、ユーザーストアを作成し、DIに与えてsigninmanagerクラスに注入することだけでした。