ASP.NET标识 - 不支持每种类型的多个对象集

时间:2014-06-21 15:46:03

标签: c# asp.net asp.net-mvc entity-framework asp.net-identity

我在我的应用中使用ASP.NET Identity时遇到错误。

  

不支持每种类型的多个对象集。对象集   '身份用户'和'用户'都可以包含类型的实例   '推荐Platform.Models.ApplicationUser'。

我在StackOverflow中看到了一些关于此错误的问题。全部表示相同类型的两个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类型是什么?我的应用程序中没有它......

4 个答案:

答案 0 :(得分:99)

你有两个相同类型的DbSet s`。

IdentityDbContext<T>本身包含Users属性,声明为:

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

你在课堂上宣布第二个。

答案 1 :(得分:68)

查看这个文件“ApplicationDbContext.cs”,删除最后由scaffold生成的行,应该是这样的:

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

答案 2 :(得分:4)

使用脚手架创建View可能引起此问题。您可能做过这样的事情:视图>添加>新脚手架项目...> MVC 5视图> [模型类:ApplicationUser]

Add View Screenshot

脚手架向导在您的ApplicationDbContext类中添加了新的代码行。

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

现在,您具有两个相同类型的DbSet属性,这不仅会导致在FindAsync()方法中抛出异常,而且还会在您尝试使用代码优先的迁移方法时抛出异常。

Exception when using code-first migrations

在使用脚手架时要非常小心,甚至最好不要使用它。

答案 3 :(得分:0)

注释来自身份模型类的新生成的Dbset,如下所示

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