この後、Identity 1.0.0からIdentity 2.0.1に移行しています article
生成される移行コードは、新しいIdentityUserに関するものではありません。新しい列は追加されません。
そこで、新しいプロジェクトを作成して再試行しましたが、移行コードは空です。
この問題を解決するために、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);
私startup.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
クラスの新しいプロパティ以外は何も変更しておらず、以前は移行前にうまく機能していました。
CodePlex に同様の問題があり、修正済みとマークされていますが、解決策はありません
誰もこれを修正する方法を知っていますか?
[〜#〜] edit [〜#〜]
SQLデータベースを編集したときに間違いを犯していないことを確認してください。別のプロジェクトを作成し、IDデータベースを生成し、そのデータベースの接続文字列を変更しましたが、同じエラーが引き続き発生します。
[〜#〜] solution [〜#〜]
データベースを編集したとき、Identity 2.0.0では、UserId
テーブルのAspUserClaims
のUser_Id
が変更されたことに気付きませんでした。その後、同じエラーが発生しましたが、ApplicationDbContext
をUserStore
コンストラクターに追加することについてtschmit007が言ったことを実行しました。
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()));
私はこれと同じ問題を抱えていました。私は、EDMXファイルを使用してデータベースの最初の開発を行っています。:base(“EDMXConnString”)
にEDMXファイルを追加するときに生成された接続文字列を使用している場合、この問題が発生する可能性が高くなります。
ASP.NET IDテーブルがあるデータベースを指す標準の接続文字列を作成することで、これを修正しました。
<add name="MyConnString" connectionString="Data Source=server; Initial Catalog=db_name; User ID=user_id; Password=password; Connect Timeout=60;" providerName="System.Data.SqlClient" />
そして、その接続文字列を:base
で使用し、機能しました!
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("MyConnString")
{
}
}
私の問題は、生成されたADO.NET接続文字列を生成コンテキストと認証コンテキストApplicationDbContext
の両方に使用しようとしたことです。認証に別の接続文字列を使用して修正しました。プロバイダーにも注意してください-認証コンテキストの場合は、System.Data.SqlClient
:
<add name="DefaultConnection" connectionString="Server=qadb.myserver.com;Database=mydb;User Id=myuser;Password=mypass;" providerName="System.Data.SqlClient" />
最初にコードを使用している場合は、providerName = "System.Data.SqlClientのように、プロバイダー名が 'SqlClient'であることを確認するために接続文字列を確認してください
最初にデータベースを使用している場合、providerName = "System.Data.EntityClientのようにproviderNameが 'EntityClient'であることを確認するために接続文字列を確認してください
このエラーメッセージも受け取りましたが、原因と解決策は異なりました。私の場合、ApplicationUserクラスにGuid型の新しいIdプロパティを導入しました。完全に有効なC#構文ですが、明らかに、リフレクションに依存して物を見つけるIdentityまたはEntityFrameworkコアに大きな混乱をもたらしました。
ApplicationUserクラスの新しいIdプロパティを削除すると、このエラーは解決しました。
私と同じ問題、それはこのコードで解決しました:
public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false)
{
Database.Connection.ConnectionString = @"data source=...;initial catalog=...;user id=...;password=...;multipleactiveresultsets=True;application name=EntityFramework";
}
私はこの問題に遭遇しましたが、それはオブジェクト名の競合でした。 IdentityConfig.csはApplicationUserを使用していましたが、自分のコンテキストのDataAccess.ApplicationUserではなく、自動生成されたIdentityModels.ApplicationUserを使用していました。私はそれを見つけたら完璧な意味を成しました。そのため、ベースWebAPIテンプレートから自動生成されたIdentityModels.csを削除しました-とにかくそれを使用しません-そして、IdentityConfig.csのusingステートメントを自分のDataAccess名前空間と適切なマッピングに追加しました。テンプレートがこれの多くをあなたのために構築したことを忘れると、あなたは問題にぶつかるでしょう:
public class ApplicationUserManager : UserManager<ApplicationUser> // the name conflict
{
public ApplicationUserManager(IUserStore<ApplicationUser> store)
: base(store)
{
}
私の問題は、新しいDbContextを作成したが、IdentityDbContextを継承していないことでした。
簡単な修正...
public partial class GoldfishDbContext : IdentityDbContext<ApplicationUser>
{
....
}
私はこれがなぜ起こるのかはわかりませんが、私の解決策は完璧に機能し、寝る前にすべてをテストしました。 12時間後、もう一度チェックして実行しましたが、これはまったく同じエラーでした。ここでSOでほぼすべてのソリューションを試しましたが、どれも機能しません。
ここでデータベースアプローチを実装しています。その後、突然これがありました
DefaultConnection
ソリューションを最初に作成したときにVisual Studioが生成したweb.configで。そのため、EDMXファイルによって生成された接続文字列の代わりにそれを使用しましたが、突然動作します!
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
これは私の動作する接続文字列でした:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-System.WEB-20180718085411.mdf;Initial Catalog=aspnet-System.WEB-20180718085411;Integrated Security=True" providerName="System.Data.SqlClient" />
もともと、私はEDMXファイルによって生成されたこれを使用していますが、以前は機能していましたが、突然Webサイトが機能しません。私は何も変更せず、すべてのコードがTFSにあったので、100%確実に機能し、完全な復元を行って最新バージョンを取得しました。
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-System.WEB-20180718085411.mdf;Initial Catalog=aspnet-System.WEB-20180718085411;Integrated Security=True" providerName="System.Data.SqlClient" />