实体typesApplicationUser不是当前上下文的模型的一部分

本文后面我将从Identity 1.0.0迁移到Identity 2.0.1

而生成的迁移代码与新的IdentityUser无关。 它不添加新的列。

于是我做了一个新的项目,再次尝试,但是迁移代码是空的。

为了解决这个问题,我直接在SQL Server中进行编辑,并在我的解决scheme中再次导入我的数据库。

现在我的AspNetUser与我的IdentityUser完全一样,如你所见

IdentityUser

 public virtual int AccessFailedCount { get; set; } public virtual ICollection<TClaim> Claims { get; } public virtual string Email { get; set; } public virtual bool EmailConfirmed { get; set; } public virtual TKey Id { get; set; } public virtual bool LockoutEnabled { get; set; } public virtual DateTime? LockoutEndDateUtc { get; set; } public virtual ICollection<TLogin> Logins { get; } public virtual string PasswordHash { get; set; } public virtual string PhoneNumber { get; set; } public virtual bool PhoneNumberConfirmed { get; set; } public virtual ICollection<TRole> Roles { get; } public virtual string SecurityStamp { get; set; } public virtual bool TwoFactorEnabled { get; set; } public virtual string UserName { get; set; } 

IdentityUser.cs

 public class ApplicationUser : IdentityUser { public bool Has_accepted_policy { get; set; } public int user_type_id { get; set; } } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection") { } } 

AspNetUser

 public string Id { get; set; } [Required] [StringLength(256)] public string UserName { get; set; } public string PasswordHash { get; set; } public string SecurityStamp { get; set; } [StringLength(256)] public string Email { get; set; } public bool EmailConfirmed { get; set; } public bool Is_Active { get; set; } [Required] [StringLength(128)] public string Discriminator { get; set; } public int? user_type_id { get; set; } public bool Has_accepted_policy { get; set; } public string PhoneNumber { get; set; } public bool PhoneNumberConfirmed { get; set; } public bool TwoFactorEnabled { get; set; } public DateTime? LockoutEndDateUtc { get; set; } public bool LockoutEnabled { get; set; } public int AccessFailedCount { get; set; } ... other virtual properties 

当我尝试注册一个用户,我有以下例外

实体typesApplicationUser不是当前上下文的模型的一部分

在这条线

 IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

我的启动.Auth.cs

 UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>()); 

而在我的AccountController我声明我的UserManager这样

 public AccountController() : this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat) { } public AccountController(UserManager<ApplicationUser> userManager, ISecureDataFormat<AuthenticationTicket> accessTokenFormat) { UserManager = userManager; AccessTokenFormat = accessTokenFormat; } public UserManager<ApplicationUser> UserManager { get; private set; } 

除了AspNetUser类中的新属性之外,我没有改变任何东西,并且在迁移之前它已经很好地工作了。

CodePlex上有类似的问题,标记为固定,但他们没有给出解决scheme

有谁知道如何解决这个问题?

编辑

为了确保我编辑我的SQL数据库时没有犯任何错误。 我创build了另一个项目,并生成一个身份数据库,我改变了该数据库的连接string,我仍然有同样的错误。

当我编辑我的数据库时,我没有注意到,在Identity 2.0.0中,他们更改了AspUserClaims表中UserIdAspUserClaims 。 这样做后,我有相同的错误,但后来我做了什么tschmit007说将ApplicationDbContext添加到UserStore构造函数,现在它的工作原理。

 UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 

对我来说,它似乎错过了一个上下文instanciation:

 UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>()); 

应该

 UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 

我有这个相同的问题。 我正在做一个EDMX文件的数据库第一次开发。 如果你在使用base(“EDMXConnString”)添加EDMX文件时产生的连接string,你很可能会遇到这个问题。

我通过创build一个指向ASP.NET Identity表所在的数据库的标准连接string来解决这个问题。

 <add name="MyConnString" connectionString="Data Source=server; Initial Catalog=db_name; User ID=user_id; Password=password; Connect Timeout=60;" providerName="System.Data.SqlClient" /> 

然后使用该连接string:base,它工作!

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("MyConnString") { } } 

我的问题是我试图使用生成的ADO.NET连接string生成和身份validation上下文ApplicationDbContext 。 我通过使用单独的连接string进行身份validation来修复它。 还要注意提供者 – 对于authentication上下文,它必须是System.Data.SqlClient

 <add name="DefaultConnection" connectionString="Server=qadb.myserver.com;Database=mydb;User Id=myuser;Password=mypass;" providerName="System.Data.SqlClient" /> 

我也收到了这个错误信息,但是原因和解决方法是不一样的。 在我的情况下,我在ApplicationUser类中引入了一个types为Guid的新Id属性。 完美有效的C#语法,但它显然造成了巨大的身份或EntityFramework核心依赖reflection来查找东西的混乱。

在我的ApplicationUser类中删除新的Id属性解决了这个错误。

我碰到这个问题,这是一个对象名称冲突。 IdentityConfig.cs使用的是ApplicationUser,但它使用的是自动生成的IdentityModels.ApplicationUser,而不是我自己的上下文的DataAccess.ApplicationUser 。 一旦我find它,就会变得完美。 所以,我从基本的WebAPI模板中删除了自动生成的IdentityModels.cs – 不再使用它 – 然后我将IdentityConfig.cs中的using语句添加到我自己的DataAccess命名空间,并且正确映射。 如果您忘记模板为您构build了很多这个模板,您将遇到这个问题:

 public class ApplicationUserManager : UserManager<ApplicationUser> // the name conflict { public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store) { } 

如果您先使用代码,请检查您的连接string以确保providerName为“SqlClient”,如providerName =“System.Data.SqlClient

如果您首先使用数据库,请检查您的连接string以确保providerName是“EntityClient”,如providerName =“System.Data.EntityClient

我的问题是,我创build了一个新的DbContext,但它不是从IdentityDbContextinheritance。

一个简单的修复…

 public partial class GoldfishDbContext : IdentityDbContext<ApplicationUser> { .... } 

这发生在我身上,因为我正尝试使用我的dependency injection容器连接ApplicationUserManager和一些其他相关的依赖关系。 在某些情况下,容器parsing了ApplicationDbContext,而在其他情况下,Owin中的内置注入器会parsing它。

确保这种情况不会发生的最简单的方法是不要尝试使用你select的DI容器连接任何Auth的东西,除非你真的知道你在用DI做什么,否则只要让Owin用它来解决它在注射器。

换句话说,删除像:

  builder.RegisterType<ApplicationUserManager>().InstancePerRequest(); 

只要让Owin按照自己的方式解决它:

  public ApplicationUserManager UserManager { get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); } private set { _userManager = value; } }