エンティティタイプ「IdentityUserLogin ' 主キーを定義する必要があります [重複] 質問する

エンティティタイプ「IdentityUserLogin ' 主キーを定義する必要があります [重複] 質問する

私は 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.jsonappsettings.json有効な接続文字列を入力して でdotnet restore実行することで、このエラーを再現できますdotnet run --environment Development

MySQL の代わりに MSSQL データベースを使用するように実装を変更しようとしましたが、まったく同じエラーが発生しました。

ベストアンサー1

Identity テーブルのキーはOnModelCreatingメソッドにマップされておりIdentityDbContext、このメソッドが呼び出されない場合は、エラーが発生します。

電話するだけです。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);
}

元の回答(念のため他の人の参考のためにコピーしました)ここ

おすすめ記事