Подтвердить что ты не робот

Как можно поставить пользователей приложений в том же контексте, что и остальные объекты?

Приложение 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 в основном файле данных данных без каких-либо внешних придирок - может кто-нибудь знает, как это сделать? Все файлы обновлены.

4b9b3361

Ответ 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")
    {
    }

Я не знаю, как много больше, чем вы можете настроить, или если это действительно изменит контекст.