Как можно поставить пользователей приложений в том же контексте, что и остальные объекты?
Приложение asp.net mvc 5 создает пользователей приложений, а также пользователей-идентификаторов в отдельном контексте, с именем "IdentityModels.cs" - это выглядит как
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
}
Я пытаюсь поместить пользователей приложения в обычный контекст данных, т.е. что-то вроде этого
public class BlogProphetContext : DbContext
{
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<Answer> Answers { get; set; }
public DbSet<Question> Questions { get; set; }
public DbSet<Tag> Tags { get; set; }
}
Однако каждый раз, когда я делаю это, я получаю следующую ошибку каждый раз, когда я пытаюсь создать учетную запись
The UserId field is required
В AccountController.cs, когда я пытаюсь выполнить следующую строку кода
result = await UserManager.AddLoginAsync(user.Id, info.Login);
Я чувствую, что мой подход неправильный, и что я не могу использовать ApplicationUsers в основном файле данных данных без каких-либо внешних придирок - может кто-нибудь знает, как это сделать? Все файлы обновлены.
Ответы
Ответ 1
Это было слишком легко - оказалось, что все, что вам нужно сделать, удаляет
<ApplicationUser>
когда вы вызываете контекст, и все получается так, как вы могли ожидать (т.е. предположения MVC и предположения разработчиков (в данном случае мои).
Здесь работает нормально
public class MyContext : IdentityDbContext
{
public MyContext()
: base("DefaultConnection")
{
}
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
public DbSet<Answer> Answers { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
}
Ответ 2
В этом случае, если вы не хотите, чтобы ваш ApplicationUser был связан с asp.net Identity, проще всего было бы удалить наследование из класса applicationUser.
Перейдите из ApplicationUser: IdentityUser только к ApplicationUser, а затем в этом классе просто создайте свойство Id.
Вместо этого вам придется использовать IdentityDBContext.
Конечно, вам придется полностью переписать AccountController или избавиться от него. Вы не можете использовать UserManager в любом случае, как это связано с IdentityUser
Затем убедитесь, что вы добавили свою базу данных миграции/обновления, если работаете с EF.
Если вы хотите сохранить контроллер учетной записи как есть и сохранить IdentityDbContext, но добавить другие объекты, то это легко, просто выполните следующее:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext() : base("DefaultConnection")
{
}
public DbSet<Dept> Dept{ get; set; }
public DbSet<Course> Course{ get; set; }
public DbSet<Etc> Etc{ get; set; }
}
Ответ 3
Убедитесь, что класс ApplicationUser наследуется от IdentityUser.
Затем вам нужно настроить свой контекст так, чтобы он правильно отображал все классы ASP.NET Identity.
Это:
- ApplicationUser (ваш класс)
- IdentityUserClaim
- IdentityUserLogin
- IdentityUserRole
- IdentityRole
Детали этого слишком сложны для публикации здесь, но я создал образец проекта, который работает с версией ASP.NET Identity. Вы можете видеть это здесь:
https://github.com/onybo/Asp.Net-Identity-sample-app/tree/master/CustomUser
Ответ 4
Я не уверен, что это поможет вам или я полностью пойму ваши вопросы... но если вы хотите попробовать использовать свою собственную "модель", то измените:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("PUT IN YOUR MODEL CONN HERE")
{
}
Я не знаю, как много больше, чем вы можете настроить, или если это действительно изменит контекст.