ApplicationUser模型的VS 2013控制器脚手架失败(不支持每种类型的多个对象集)

AKh*_*oli 19 scaffolding

在使用EF 6的VS 2013 RTM,MVC 5项目中,我尝试使用基于ApplicationUser的控制器(默认使用个人帐户身份验证)来构建控制器.双方ApplicationUser并IdentityUser映射到用户表.该向导打开上下文文件以进行编辑,并尝试为ApplicationUser(ApplicationUsers)添加新的数据库集,然后失败并显示以下错误:

Unable to retrieve metadata for ApplicationUser. Multiple object sets per type are not supported. The object sets ApplicationUsers and Users can both contain instances of type ApplicationUser 该解决方案没有任何参考或实例ApplicationUsers.

这是一个已知的问题?脚手架可以使用命令行和选项(来自PMC)运行吗?注意:如果我指定一个引用ApplicationUser的模型,脚手架还会向上下文类添加一个额外的数据库集(如果删除它并在生成控制器中修复引用,则应用程序可以正常工作).

Chr*_*att 32

哇.我真的很惊讶没有人真正掌握了这一点,而只是建议解决方法.

IdentityDbContext 已经包含一个属性:

`public virtual IDbSet<TUser> Users { get; set; }
Run Code Online (Sandbox Code Playgroud)

当您IdentityDbContext创建自己的特定于应用程序的上下文时,必须指定哪个类满足TUser泛型.默认为:

public ApplicationDbContext : IdentityDbContext<ApplicationUser>
Run Code Online (Sandbox Code Playgroud)

这意味着您在功能上已经通过以下形式的继承具有属性:

public IDbSet<ApplicationUser> Users { get; set; }
Run Code Online (Sandbox Code Playgroud)

如果您随后将另一个属性添加到特定于应用程序的上下文中,例如:

public DbSet<ApplicationUser> ApplicationUsers { get; set; }
Run Code Online (Sandbox Code Playgroud)

您现在拥有由两个DbSets 跟踪的相同实体,并且您得到该错误.解决方案?只是不添加自己DbSet的ApplicationUser.无需重命名或覆盖任何内容.

  • 使用Entity Framework为ApplicationUser类添加带有视图的控制器时. (4认同)
  • 问题是在脚手架中自动添加DbSet. (3认同)
  • 这是令人惊讶的,但如果是这种情况,那么要么不使用脚手架,要么在脚手架完成后删除添加的行. (2认同)

Jam*_*aug 16

Short-Version:将ApplicationUser类重命名为User.

我已经遇到这个问题大约一个月了,绝对没有运气......直到现在!

最初,我认为这是一个预览问题,但在与最新的库一起持续进入RTM之后,我变得异常恼火,因为这个问题一直存在于迁移中.

但是,根据错误消息,IdentityDbContext似乎正在创建两个DbSet:ApplicationUsers和Users.在查看源代码时我们只希望用户:

public class IdentityDbContext<TUser> : DbContext where TUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser
{
    ...
    public virtual IDbSet<TUser> Users { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

从这里,我们(和脚手架引擎,以及迁移引擎)应该只看到"用户",而不是"ApplicationUsers".

要纠正这种情况,您需要调整应用程序类以解决这个相当奇怪的错误.只需将ApplicationUser类重命名为User:

using Microsoft.AspNet.Identity.EntityFramework 
...
public class ApplicationUser : IdentityUser
{
    Your Stuff
}
Run Code Online (Sandbox Code Playgroud)

至:

using Microsoft.AspNet.Identity.EntityFramework 
...
public class User: IdentityUser
{
    Your Stuff
}
Run Code Online (Sandbox Code Playgroud)

再次尝试脚手架.如果你收到另外一个错误的类无法找到,保存你的项目,关闭VS2013,重新打开VS2013,加载项目,重新构建项目,最后尝试脚手架.IdentityDBContext不应再创建虚拟"ApplicationUsers"DBSet对象,导致实体迁移和脚手架发出这些错误.

希望这可以帮助!

PS任何完成的映射都不应该影响这个问题,所以如果你愿意,你应该能够仍然映射到同一个表.

编辑: 如果您收到进一步的问题,请撤消重命名.我遇到了一些问题(更多的脚手架和查询错误),在我回到之后ApplicationUser,这些问题消失了,上面的问题没有重新出现.只是一个抬头.


小智 7

阅读以上问题和解决方案.我的错误文字是:

不支持每种类型的多个对象集.对象集'ApplicationUsers'和'Users'都可以包含'DataLayerIdentity.Models.ApplicationUser'类型的实例

我怀疑这个错误是在我玩的时候创建的并且搭建了模型:ApplicationUser在一个新的控制器中.

通过从ApplicationDbContext.cs中删除以下内容解决了这个问题

    public System.Data.Entity.DbSet<DataLayerIdentity.Models.ApplicationUser> ApplicationUsers
    {
        get;
        set;
    }
Run Code Online (Sandbox Code Playgroud)

没有其他改变解决问题的方法.我希望这可以帮助别人.


Gre*_*olf 7

当您使用scaffolding生成控件时,vs会自动将1行插入到您的db上下文中

public System.Data.Entity.DbSet<...API.Models.ApplicationUser> ApplicationUsers { get; set; }
Run Code Online (Sandbox Code Playgroud)

只需删除该行,并在控制器中.改变 db.ApplicationUsers以db.Users


Mil*_*vec 5

我花了一天多的时间来解决这个问题... :(((重命名类只是解决方法.正确的解决办法是从ApplicationContext(IdentityModels.cs)中删除这一行.我不知道它何时被插入到我的代码中.

System.Data.Entity.DbSet ApplicationUsers {get; 组; }

用户在内部管理,应该只有USER DEFINED TABLES.这意味着这个错误的行是第二次出现,这就是"多个对象集"错误消息的原因.

删除此行并编译后,我在自动生成的视图代码中收到了几条错误消息,因为它已经引用了错误的声明.您可以手动重新创建视图或修复代码,只需简单地重命名对ApplicationUser的错误引用以更正用户(在内部正确定义,而不是在IdentityModels.cs中)

在尝试查找解决方案期间,我也损坏了我的迁移,因此我不得不从头开始将数据结构迁移到DB.

现在我完全从这个问题中恢复过来,几乎ROOT问题很明显.不幸的是,根本问题可能是VS2013中的一个错误,它会产生错误的额外线路.

但无论如何,继续微笑.与Java中的编程相比,面对这样的错误是没有办法的:)