ASP.NET Идентичность — Несколько наборов объектов для каждого типа не поддерживаются

#c# #asp.net-mvc-5

Вопрос:

Я получил ошибку, используя ASP.NET Личность в моем приложении.

Несколько наборов объектов для каждого типа не поддерживаются. Наборы объектов «Пользователи удостоверений» и «Пользователи» могут содержать экземпляры типа «Платформа рекомендаций».Модели.Пользователь приложения».

Я видел несколько вопросов об этой ошибке в StackOverflow. Все указывают на два DbSet объекта одного и того же типа. Но в моем DbContext нет таких же типов DbSets . Исключение создается для FindAsync() метода во время входа в систему.

 if (ModelState.IsValid)
    var user = await UserManager.FindAsync(model.UserName, model.Password);
    if (user != null amp;amp; user.IsConfirmed)
    {
 

Проблема в том, что у меня нет двух DbSets одинаковых типов. Мои контексты выглядят так:

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

    public System.Data.Entity.DbSet<RecommendationPlatform.Models.ApplicationUser> IdentityUsers { get; set; }

}
 

и

 public class RecContext : DbContext
{
    public RecContext()
        : base("RecConnection")
    {
        Database.SetInitializer<RecContext>(new DropCreateDatabaseIfModelChanges<RecContext>());
    }

    public DbSet<Recommendation> Recommendations { get; set; }
    public DbSet<Geolocation> Geolocations { get; set; }
    public DbSet<Faq> Faqs { get; set; }
    public DbSet<IndexText> IndexTexts { get; set; }
}
 

Что может вызвать эту проблему? Может быть, что-то связанное со встроенным ASP.NET Функции идентификации? В любом случае, что такое Users тип? У меня его нет в приложении…

Ответ №1:

У вас действительно есть две DbSet буквы » с » одного и того же типа.

IdentityDbContext<T> само по себе содержит Users свойство, объявленное как:

 public DbSet<T> Users { get; set; }
 

Ты второй в своем классе.

Комментарии:

1. Загляните внутрь IdentityModel.cs, вы найдете общедоступный класс ApplicationDbContext : IdentityDbContext<Пользователь приложения> Внутри этого контекста VS иногда добавляет набор баз данных<Пользователь приложения><Пользователь приложения> Пользователи приложений

2. @VasilValchev при наследовании от класса IdentityUser он содержит набор баз данных пользователей

3. Я также получил ту же ошибку, но я никогда не добавлял эту строку в IdentityModel.cs. Как это волшебным образом получилось, что он попал туда и начал выбрасывать ошибку. Я даже загружаю свои изменения в git. Как получилось, что эта строка появилась там волшебным образом. Пожалуйста, направьте меня. P. S: добавление этой строки устраняет проблему

Ответ №2:

просмотрите этот файл «ApplicationDbContext.cs», удалите строку, автоматически сгенерированную последним шаблоном, должно быть так:

 public System.Data.Entity.DbSet<Manager.Models.ApplicationUser> IdentityUsers { get; set; }
 

Комментарии:

1. Спасибо, теперь я знаю, что виновник-это строительные леса, которые только что сделал мастер нового контроллера.

2. Мило! Я никогда не использовал эшафот, а после того, как использовал его для создания контроллера, все пошло не так! Хороший совет, братан!

Ответ №3:

Эта проблема может возникнуть из-за использования строительных лесов для создания View . Вы, вероятно, сделали что-то вроде этого: Просмотр > Добавить >> Новый элемент каркаса… >>> Представление MVC 5 >>>> [Класс модели: Пользователь приложения]>>>>.

Добавить Скриншот Просмотра

Мастер создания строительных лесов добавил новую строку кода в ваш ApplicationDbContext класс.

 public System.Data.Entity.DbSet<RecommendationPlatform.Models.ApplicationUser> IdentityUsers { get; set; }
 

Теперь у вас есть два DbSet свойства одного и того же типа, которые не только вызывают исключение в FindAsync() методе, но и при попытке использовать миграции с первым кодом.

Исключение при использовании миграции с первым кодом

Будьте очень осторожны при использовании строительных лесов или, еще лучше, не используйте их.

Комментарии:

1. Именно это и случилось со мной! Примечание: если вы создали контроллер с такими строительными лесами, то измените «Пользователь приложения» на «Пользователь» в контроллере

Ответ №4:

Прокомментируйте новый сгенерированный набор баз данных из класса модели идентификации, как показано ниже

 // public System.Data.Entity.DbSet<SurveyTool.Models.ApplicationUser> ApplicationUsers { get; set; }