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

本文关键字:上下文 模型 一部分 类型 ApplicationUser 实体 | 更新日期: 2023-09-27 18:05:28

阅读本文后,我将从Identity 1.0.0迁移到Identity 2.0.1

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

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

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

现在我的AspNetUserIdentityUser是完全一样的你可以看到

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 

,当我尝试注册一个用户时,我有以下异常

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

在这行

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

My startup.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上有一个类似的问题,标记为固定,但他们没有给出解决方案

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

编辑

确保我在编辑SQL数据库时没有犯任何错误。我创建了另一个项目,并生成了一个身份数据库,我更改了该数据库的连接字符串,我仍然有相同的错误。

<<p> 解决方案/strong>

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

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

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

我也有同样的问题。我正在使用EDMX文件进行数据库优先开发。
如果您使用的是在:base(“EDMXConnString”)中添加EDMX文件时生成的连接字符串,那么您很可能会遇到这个问题。

我通过创建一个指向数据库的标准连接字符串来修复这个问题。. NET标识表为。

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

然后在:base中使用该连接字符串,它工作了!

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

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

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

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

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

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

如果您首先使用代码,请检查您的连接字符串,以确保providerName是'SqlClient',如providerName="System.Data.SqlClient

如果您首先使用数据库,检查您的连接字符串,以确保providerName是'EntityClient',如providerName="System.Data "。EntityClient

同样的问题对我来说,它通过以下代码解决:

public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false)
{
    Database.Connection.ConnectionString = @"data source=...;initial catalog=...;user id=...;password=...;multipleactiveresultsets=True;application name=EntityFramework";
}

我也收到了这个错误信息,但是原因和解决方法不同。在我的例子中,我在ApplicationUser类中引入了Guid类型的新Id属性。完全有效的c#语法,但它显然造成了巨大的混乱身份或实体框架的核心,依赖于反射来寻找东西。

删除ApplicationUser类中的新Id属性解决了此错误。

我遇到了这个问题,它是一个对象名称冲突。IdentityConfig.cs正在使用ApplicationUser,但是它正在使用自动生成的IdentityModels。ApplicationUser而不是我自己的上下文的DataAccess.ApplicationUser。我一发现就明白了。所以,我从基础WebAPI模板中删除了自动生成的IdentityModels.cs -无论如何不再使用它-然后我将IdentityConfig.cs中的using语句添加到我自己的DataAccess命名空间中,然后,正确的映射。如果您忘记了模板为您构建了很多这些,您将遇到问题:

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

我的问题是,我已经创建了一个新的DbContext,但它没有从IdentityDbContext继承。

一个简单的修复…

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

我不确定为什么会发生这种情况,我的解决方案工作得很好,在我睡觉前测试了一切。12小时后,我再次检查并运行,这是完全相同的错误。我在SO中尝试了几乎所有的解决方案,但没有一个有效。

我在这里实现一个数据库方法。然后突然出现了这个

DefaultConnection

在我的网页上。当我第一次创建解决方案时,Visual Studio生成的配置。所以我用它来代替由我的EDMX文件生成的连接字符串,突然它工作了!

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }   
}

这是我的连接字符串的工作:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)'MSSQLLocalDB;AttachDbFilename=|DataDirectory|'aspnet-System.WEB-20180718085411.mdf;Initial Catalog=aspnet-System.WEB-20180718085411;Integrated Security=True" providerName="System.Data.SqlClient" />

原来我使用这个是由我的EDMX文件生成的,但突然网站不工作,虽然它以前工作。我没有改变任何东西,所有的代码都在TFS,所以我100%肯定它的工作,我做了一个完整的恢复,并获得最新版本:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)'MSSQLLocalDB;AttachDbFilename=|DataDirectory|'aspnet-System.WEB-20180718085411.mdf;Initial Catalog=aspnet-System.WEB-20180718085411;Integrated Security=True" providerName="System.Data.SqlClient" />

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

确保这种情况不会发生的最简单的方法是不要尝试使用您选择的DI容器连接任何Auth内容,除非您真正知道要使用DI做什么…否则,就让Owin用内置的注入器来解决它。

换句话说,删除如下内容:

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

让Owin按照它内置的方式解决它:

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