我使用的是带有数据库优先工作流的ASP.NET MVC 5。我已经在现有数据库中创建了标识表(AspNetUsers
、AspNetRoles
等),但在使注册和登录功能正常工作时遇到问题。
这是IdentityModels.cs
级
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("MyConnectionString") // I use "MyConnectionString" instead of "DefaultConnection"
{
}
这就是来自web.config
的EF连接字符串看起来像的样子
<connectionStrings><add name="MyConnectionString" connectionString="metadata=res://*/Entities.MyModel.csdl|res://*/Entities.MyModel.ssdl|res://*/Entities.MyModel.msl;provider=System.Data.SqlClient;provider connection string="data source=My-PcSQLEXPRESS;initial catalog=MyExistingDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
这里是从edmx生成的上下文类
public partial class MyConnectionString : DbContext
{
public MyConnectionString()
: base("name=MyConnectionString")
{
}
对我来说,一切似乎都很好,它应该能够在数据库中创建用户,但我在登录或尝试分别注册时遇到了以下错误:
登录:
实体类型ApplicationUser不是的模型的一部分当前上下文
第73行:var result=await SignInManager.PasswordSignInAsync(model.Email,模型密码,型号。记住我,应该锁定:false);
异常详细信息:System.InvalidOperationException:实体类型ApplicationUser不是当前上下文模型的一部分。
对于寄存器:
实体类型ApplicationUser不是的模型的一部分当前上下文
第155行:var result=await UserManager.CreateAsync(user,模型密码);
异常详细信息:System.InvalidOperationException:实体类型ApplicationUser不是当前上下文模型的一部分。
周围的大多数文章似乎都集中在代码优先,如何从LocalDb到SQLExpress等,以及如何更改连接字符串,但我已经有很长一段时间没能解决这个问题了。
编辑,解决方案:正如@ChrFin提到的,你可以同时使用它们,这就是我最终所做的。我只是在web.config
中添加了一个新的常规连接字符串,并让它指向现有的数据库。PS。请记住,连接字符串名称不能与现有名称相同,并且必须与您提供给ApplicationDbContext
构造函数的名称相同。
我认为ASP.NET Identity不支持这种情况,因为它需要扩展IdentityDbContext<ApplicationUser>
(或类似功能)的DbContext
。
为什么要在DB First上下文中强制使用Identity
您可以将"标识"的"代码优先"上下文与其他"数据库优先"上下文一起使用,而不会出现问题。。。
您可以通过以下步骤解决此问题:
- 1-在数据库上创建aspnetuser-etc表(无论您想要什么数据库使用)
- 简单地将应用程序与数据库连接起来,而不使用实体框架,我说的只是简单的连接
-
您可以在web.config文件中找到连接字符串。
-
将此连接字符串放入标识模型clsss-
- 您的Register和Token方法正在运行
- 现在,您可以通过数据优先的方法对其余的表使用实体framewoek