1. ホーム
  2. c#

[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。

2022-01-18 22:34:08

質問

Identity 1.0.0 から Identity 2.0.1 への移行は、次のように行います。 記事

と生成された移行コードは、新しいIdentityUserについては何もありません。新しいカラムを追加しないのです。

そこで、新しいプロジェクトを作り、もう一度やってみましたが、migrationsのコードは空っぽです。

この問題を解決するために、私はSQL Serverで直接編集を行い、私のソリューションにデータベースを再度インポートしました。

これで私の AspNetUser は、私の IdentityUser ご覧の通り

IdentityUser

public virtual int AccessFailedCount { get; set; }

public virtual ICollection<TClaim> Claims { get; }

public virtual string Email { get; set; }

public virtual bool EmailConfirmed { get; set; }

public virtual TKey Id { get; set; }

public virtual bool LockoutEnabled { get; set; }

public virtual DateTime? LockoutEndDateUtc { get; set; }

public virtual ICollection<TLogin> Logins { get; }

public virtual string PasswordHash { get; set; }

public virtual string PhoneNumber { get; set; }

public virtual bool PhoneNumberConfirmed { get; set; }

public virtual ICollection<TRole> Roles { get; }

public virtual string SecurityStamp { get; set; }

public virtual bool TwoFactorEnabled { get; set; }

public virtual string UserName { get; set; }

IdentityUser.cs

public class ApplicationUser : IdentityUser
{
    public bool Has_accepted_policy { get; set; }
    public int user_type_id { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {

    }
}

AspNetUser

public string Id { get; set; }

[Required]
[StringLength(256)]
public string UserName { get; set; }

public string PasswordHash { get; set; }

public string SecurityStamp { get; set; }

[StringLength(256)]
public string Email { get; set; }

public bool EmailConfirmed { get; set; }

public bool Is_Active { get; set; }

[Required]
[StringLength(128)]
public string Discriminator { get; set; }

public int? user_type_id { get; set; }

public bool Has_accepted_policy { get; set; }

public string PhoneNumber { get; set; }

public bool PhoneNumberConfirmed { get; set; }

public bool TwoFactorEnabled { get; set; }

public DateTime? LockoutEndDateUtc { get; set; }

public bool LockoutEnabled { get; set; }

public int AccessFailedCount { get; set; }

... other virtual properties 

で、ユーザーを登録しようとすると、次のような例外が発生します。

エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。

この行で

IdentityResult result = await UserManager.CreateAsync(user, model.Password);

私の スタートアップ.Auth.cs

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

そして、私の AccountController を宣言しています。 UserManager このように

public AccountController()
    : this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat)
{
}

public AccountController(UserManager<ApplicationUser> userManager,
    ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
    UserManager = userManager;
    AccessTokenFormat = accessTokenFormat;
}

public UserManager<ApplicationUser> UserManager { get; private set; }

の新しいプロパティ以外は何も変えていません。 AspNetUser クラスで、移行前はうまく動作していました。

にも同様の問題があります。 コードプレックス は修正済みと表示されていますが、解決策は示されていません。

どなたか修正方法をご存知でしょうか?

EDIT

念のため、SQLデータベースを編集した際に、何か間違いがなかったか確認するためです。別のプロジェクトを作成し、Identityデータベースを生成して、そのデータベースの接続文字列を変更しましたが、まだ同じエラーが発生します。

解決方法

データベースを編集しているとき、Identity 2.0.0 では User_Id に対して UserIdAspUserClaims テーブルを作成します。そのあと、同じエラーが発生しましたが、tschmit007さんがおっしゃるように ApplicationDbContextUserStore のコンストラクタを使用すると、動作するようになりました。

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

解決方法は?

私の場合、コンテキストのインスタンス化を失敗しているようです。

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());

であるべきです。

UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));