Я переношу с Identity 1.0.0 на Identity 2.0.1, следуя этой статье
и генерируемый код миграции ничего не значит о новом 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 отмечена как фиксированная, но они не дают решение
Кто-нибудь знает, как это исправить?
ИЗМЕНИТЬ
Конечно, я не делал ошибок при редактировании базы данных SQL. Я создал другой проект и создал базу данных Identity, и я изменил строку подключения для этой базы данных, и я все еще имею ту же ошибку.
Решение
Когда я редактировал свою базу данных, я не заметил, что в Identity 2.0.0 они изменили таблицу User_Id
для UserId
в AspUserClaims
. После этого у меня была такая же ошибка, но затем я сделал то, что tschmit007 сказал о добавлении конструктора ApplicationDbContext
в конструктор UserStore
, и теперь он работает.
UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));