更改ASP.NET标识以使用现有数据库

本文关键字:数据库 ASP NET 标识 更改 | 更新日期: 2023-09-27 18:21:58

我使用的是带有数据库优先工作流的ASP.NET MVC 5。我已经在现有数据库中创建了标识表(AspNetUsersAspNetRoles等),但在使注册登录功能正常工作时遇到问题。

这是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=&quot;data source=My-Pc'SQLEXPRESS;initial catalog=MyExistingDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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标识以使用现有数据库

我认为ASP.NET Identity不支持这种情况,因为它需要扩展IdentityDbContext<ApplicationUser>(或类似功能)的DbContext

为什么要在DB First上下文中强制使用Identity
您可以将"标识"的"代码优先"上下文与其他"数据库优先"上下文一起使用,而不会出现问题。。。

您可以通过以下步骤解决此问题:

  • 1-在数据库上创建aspnetuser-etc表(无论您想要什么数据库使用)
  • 简单地将应用程序与数据库连接起来,而不使用实体框架,我说的只是简单的连接
  • 您可以在web.config文件中找到连接字符串。

  • 将此连接字符串放入标识模型clsss-

  • 您的Register和Token方法正在运行
  • 现在,您可以通过数据优先的方法对其余的表使用实体framewoek