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】:

您确实有两个相同类型的DbSets`。

IdentityDbContext&lt;T&gt; 本身包含 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(唯一标识符类型)作为键?

asp.net使用Model层与不使用Model区别

Asp.Net Core 轻松学-使用MariaDB/MySql/PostgreSQL和支持多个上下文对象

415 不支持的媒体类型 asp.net 核心

不支持的媒体类型 ASP.NET Core Web API