我在article
之后从Identity 1.0.0迁移到Identity 2.0.1并且生成的迁移代码与新的IdentityUser无关。它不会添加新列。
所以我创建了一个新项目并再次尝试,但迁移代码为空。
为了解决这个问题,我直接在SQL Server中进行了编辑,并在我的解决方案中再次导入了我的数据库。
现在我的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
当我尝试注册用户时,我有以下异常
实体类型ApplicationUser不是当前上下文的模型的一部分
在这一行
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
我的 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数据库时,确保我没有犯任何错误。我创建了另一个项目并生成了一个Identity数据库,我更改了该数据库的连接字符串,但仍然有同样的错误。
解
当我编辑数据库时,我没有注意到在Identity 2.0.0中他们更改了User_Id
表中UserId
的{{1}}。在这之后我遇到了同样的错误,但后来我做了tschmit007关于将AspUserClaims
添加到ApplicationDbContext
构造函数的说法,现在它可以工作了。
UserStore
答案 0 :(得分:68)
我遇到了同样的问题。我正在使用EDMX文件进行数据库优先开发。
如果您使用在:base(“EDMXConnString”)
中添加EDMX文件时生成的连接字符串,则很可能会出现此问题。
我通过创建指向ASP.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")
{
}
}
答案 1 :(得分:40)
对我而言似乎错过了一个背景实例:
UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());
应该是
UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
答案 2 :(得分:7)
My problem was I tried to use generated ADO.NET connection string for both generated and authentication context ApplicationDbContext
. I fixed it by using a separate connection string for authentication. Also pay attention to the provider - for authentication context it has to be System.Data.SqlClient
:
<add name="DefaultConnection" connectionString="Server=qadb.myserver.com;Database=mydb;User Id=myuser;Password=mypass;" providerName="System.Data.SqlClient" />
答案 3 :(得分:3)
如果您首先使用代码,请检查您的连接字符串,以确保providerName为'SqlClient',如providerName =“System.Data.SqlClient
如果您首先使用数据库,请检查您的连接字符串,以确保providerName为'EntityClient',如providerName =“System.Data.EntityClient
答案 4 :(得分:1)
我也收到了此错误消息,但原因和解决方案不同。在我的例子中,我在我的ApplicationUser类中引入了一个类型为Guid的新Id属性。完全有效的C#语法,但它显然为Identity或EntityFramework核心创建了大量的混淆,它依赖于反射来查找东西。
删除ApplicationUser类中的新Id属性解决了此错误。
答案 5 :(得分:1)
我遇到了这个问题,这是一个对象名称冲突。 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)
{
}
答案 6 :(得分:0)
我确定不是为什么会这样,我的解决方案工作得很好,在入睡之前测试了所有内容。 12小时后,我再次检查并运行,这是完全相同的错误。我在SO中尝试了几乎所有解决方案,但没有一个起作用。
我在这里实现数据库方法。然后突然有
我第一次创建解决方案时Visual Studio生成的web.config上的DefaultConnection
。因此,我用它代替了我的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" />
答案 7 :(得分:0)
对我来说同样的问题,可以通过以下代码解决:
public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false)
{
Database.Connection.ConnectionString = @"data source=...;initial catalog=...;user id=...;password=...;multipleactiveresultsets=True;application name=EntityFramework";
}
答案 8 :(得分:-1)
这发生在我身上,因为我试图使用我的依赖注入容器连接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;
}
}