ASP.NET 标识 - 不支持每种类型的多个对象集
Posted
技术标签:
【中文标题】ASP.NET 标识 - 不支持每种类型的多个对象集【英文标题】:ASP.NET Identity - Multiple object sets per type are not supported 【发布时间】:2014-08-12 03:42:42 【问题描述】:在我的应用程序中使用 ASP.NET Identity 时出错。
不支持每种类型的多个对象集。对象集 “身份用户”和“用户”都可以包含类型的实例 '推荐平台.Models.ApplicationUser'。
我在 *** 中看到了一些关于此错误的问题。都指示在两个相同类型的DbSet
对象上。但是在我的DbContext
中没有相同类型的DbSets
。登录时FindAsync()
方法抛出异常。
if (ModelState.IsValid)
var user = await UserManager.FindAsync(model.UserName, model.Password);
if (user != null && 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
s`。
IdentityDbContext<T>
本身包含 Users
属性声明为:
public DbSet<T> Users get; set;
你在班上宣布第二个。
【讨论】:
查看IdentityModel.cs里面,你会发现public class ApplicationDbContext : IdentityDbContext 在这个context里面,VS有时候会添加DbSet ApplicationUsers @VasilValchev 当您从 IdentityUser 类继承时,它包含用户 DbSet 我也遇到了同样的错误,但我从未在 IdentityModel.cs 中添加过这一行。它是如何神奇地来到那里并开始抛出错误的。我什至在 git 中上传我的更改。这条线怎么会神奇地出现在那里。请指导我。 P.S:评论那条线解决了这个问题【参考方案2】:查看这个文件“ApplicationDbContext.cs”,去掉最后脚手架自动生成的那一行,应该是这样的:
public System.Data.Entity.DbSet<Manager.Models.ApplicationUser> IdentityUsers get; set;
【讨论】:
谢谢,现在我知道罪魁祸首是新控制器向导刚刚做的脚手架。 不错!我从来没有使用过脚手架,在用它来构建控制器之后,一切都出错了!不错的小费兄弟!【参考方案3】:使用脚手架创建View
可能会出现此问题。你可能做了这样的事情:View > Add > New Scaffold Item...> MVC 5 View > [Model class: ApplicationUser]。
脚手架向导在您的 ApplicationDbContext
类中添加了一行新代码。
public System.Data.Entity.DbSet<RecommendationPlatform.Models.ApplicationUser> IdentityUsers get; set;
现在您有两个相同类型的 DbSet
属性,这不仅会导致在 FindAsync()
方法中引发异常,而且在您尝试使用代码优先迁移时也会引发异常。
使用脚手架时要非常小心,最好不要使用它。
【讨论】:
这正是发生在我身上的事!注意:如果你用这样的脚手架生成了一个控制器,那么在控制器中将“ApplicationUser”更改为“User”【参考方案4】:从身份模型类中注释新生成的 Dbset,如下所示
// public System.Data.Entity.DbSet<SurveyTool.Models.ApplicationUser> ApplicationUsers get; set;
【讨论】:
以上是关于ASP.NET 标识 - 不支持每种类型的多个对象集的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net Core Web API:GET 请求中不支持的媒体类型
为啥新的 ASP.NET 标识表停止使用 Guid(唯一标识符类型)作为键?