#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; }