次のソリューションは.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>
これを追加して機能しました:
builder.Entity<IdentityUserRole<Guid>>().HasKey(p => new { p.UserId, p.RoleId });
最も一般的な理由
「THE-MODEL」のDbSetを作成できません。このタイプはコンテキストのモデルに含まれていないためです
以下の通り
あなたの場合、RoleはIdentityRoleClaimを継承し、それは設定されておらず、デフォルトの規則はキーとして「Id」を必要としましたが、そのプロパティがなかったため、設定する必要がありました。 Id => new {UserId、RoleId}のようなロールでプロパティを作成し、慣例によりエンティティフレームワークのキープロパティとしてIDを提示する場合にも機能します。
AppDbContext
がDbContext
から継承されていないことを確認しますが、代わりにIdentityDbContext<ApplicationUser>
から継承する必要があります。
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 *タイプにこだわるでしょう。
以下を追加して修正しました:
public DbSet<ApplicationRole> ApplicationRoles { get; set; }
私のDbContext
に。
モデルビルダーを使用して、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>();
}
私の場合、これはエンティティを手動で追加し、DbContextの下に次のエンティティを追加するのを忘れていたために発生していました。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
new CryptoCoinsMap(modelBuilder.Entity<CoinMaster>());
new CoinQuotesDailyMap(modelBuilder.Entity<CoinQuotesDaily>());
}
私は同様の問題を抱えていました。これは私の場合、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クラスに注入することだけでした。