私は Linux で dotnet core 1.1 を使用していますが、startup.cs --> configure で次の行を実行するたびに、identityContext を通常の dbContext から分割しようとすると問題が発生します。
//... some other services
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>().Database.Migrate();
//running other database.migrations here + seeding data. But it is the line above that causes problems
したがって、この行は例外をスローします: エンティティタイプ 'IdentityUserLogin' には主キーを定義する必要があります
私はこれをまったく理解していません。IdentityUserLogin に主キーを与えるのがなぜ私の仕事なのでしょうか?? これはサードパーティのクラスであり、私はそれに触れたことすらありません。私は次の簡単な設定をしています:
namespace EsportshubApi.Models
{
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
public ApplicationDbContext()
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
}
そして、applicationUser:
namespace EsportshubApi.Models.Entities
{
public class ApplicationUser : IdentityUser
{
public ApplicationUser() { }
public static ApplicationUserBuilder Builder()
{
return new ApplicationUserBuilder(new ApplicationUser());
}
public int AccountId { get; set; }
public Guid AccountGuid { get; set; }
public string Salt { get; set; }
public bool Verified { get; set; }
public string Checksum { get; set; }
public string Password { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
}
}
私のスタートアップでは、ID フレームワークを次のように構成しています。
サービスを構成する:
services.AddEntityFrameworkSqlServer().AddMySQL().AddDbContext<ApplicationDbContext>(options =>
options.UseMySQL(config["ConnectionStrings:DefaultConnection"]));
そして
構成、設定:
app.UseIdentity();
私のプロジェクトは以下でオープンソース化されています:私のgithubリポジトリ
それが役に立つならば。
いろいろ試してみました。最も有望な 2 つの方法は、この汎用ショーで使用されているすべてのクラスを派生させて明示的に渡し、すべてのキーを int などに変更してみるというものでした。しかし、文字列ではなく を使用しただけでまったく同じエラーが発生しました。私が試したもう 1 つの方法は、 内で次の操作を実行して、IdentityUserLogin に主キーを付与することint
でした。例:OnModelCreating
modelBuilder.Entity<IdentityUserLogin<int>>()
.Property(login => login.UserId)
.ForMySQLHasColumnType("PK")
.UseSqlServerIdentityColumn()
.UseMySQLAutoIncrementColumn("AI");
ご覧のとおり、これはUserIdを整数で持っていた頃のものですが、UserIdがprimaryKeyであるべきかどうかさえわかりません。このエラーの代わりに、次のような他のエラーが表示されることがあります。
IdentityUserLoginは階層の一部であり、識別子の値はありません。
しかし、判別子の値があった場合、結局このエラーに戻ります。私が思うに、最も奇妙な部分は、UnicornStore github の例とまったく同じ実装があり、アイデンティティ フレームワークも少し使用していることです。皆さんの助けが本当に必要です。プロジェクトをダウンロードし、 を にコピーしdefault.appsettings.json
、appsettings.json
有効な接続文字列を入力して でdotnet restore
実行することで、このエラーを再現できますdotnet run --environment Development
。
MySQL の代わりに MSSQL データベースを使用するように実装を変更しようとしましたが、まったく同じエラーが発生しました。
ベストアンサー1
Identity テーブルのキーはOnModelCreating
メソッドにマップされておりIdentityDbContext
、このメソッドが呼び出されない場合は、エラーが発生します。
電話するだけです。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
元の回答(念のため他の人の参考のためにコピーしました)ここ