如何在现有数据库 ASP.NET Core MVC 和 EF Core(DB-First)中使用 Identity

Posted

技术标签:

【中文标题】如何在现有数据库 ASP.NET Core MVC 和 EF Core(DB-First)中使用 Identity【英文标题】:How can I use Identity with my existing database ASP.NET Core MVC and EF Core (DB-First) 【发布时间】:2021-07-25 08:09:41 【问题描述】:

我在我的项目中使用 ASP.NET Core 5.0 MVC 和 EF Core 5。我创建了一个带有表User的SQL Server数据库,但是当我开始实现授权、注册和角色管理时,我决定使用Core Identity。

我浏览了很多文章,学习了如何从原始数据库(Scaffold-DbContext)逆向工程模型,如何使用继承(@ 987654325@)...

但我没有找到主要问题的答案:如何在现有数据库中使用 Identity,例如,在表(“篮子”)中指定 AspNetUsers([Id]) 的外键,同时保留所有核心身份的功能。也许我应该使用2个DbContexts或其他什么,我不知道,我只是一个初学者。

我的IdentityContext 具有自定义角色和用户:

public partial class HotelServiceContext : IdentityDbContext<User, Role, int>

    public HotelServiceContext()
    
    

    public HotelServiceContext(DbContextOptions<HotelServiceContext> options)
        : base(options)
    
    

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<User>().ToTable("Users");
        modelBuilder.Entity<IdentityUserLogin<int>>().ToTable("UserLogins");
        modelBuilder.Entity<IdentityUserToken<int>>().ToTable("UserTokens");
        modelBuilder.Entity<IdentityUserClaim<int>>().ToTable("UserClaims");
        modelBuilder.Entity<IdentityUserRole<int>>().ToTable("UserRoles");
        modelBuilder.Entity<IdentityRoleClaim<int>>().ToTable("RoleClaims");
        modelBuilder.Entity<Role>().ToTable("Roles");

    

我的DBContext,我通过执行命令Scaffold-DbContext 得到的(它还包含身份表的工作,我之前使用Update-Database 在数据库中创建)。

public TestContext(DbContextOptions<TestContext> options)
    : base(options)



public virtual DbSet<Administrator> Administrators  get; set; 
public virtual DbSet<AppUser> AppUsers  get; set; 
public virtual DbSet<Basket> Baskets  get; set; 
public virtual DbSet<Building> Buildings  get; set; 
public virtual DbSet<Client> Clients  get; set; 
public virtual DbSet<Feedback> Feedbacks  get; set; 

// ... And other generated code.

提前感谢您的回答。

【问题讨论】:

好的,现在我已经找到了解决这个问题的方法。我将现有数据库中生成的代码添加到IdentityContext,之后在OnModelCreating 方法中,我使用API Fluent 将依赖项添加到AspNetUser 表并删除生成的DBContext。它似乎工作 【参考方案1】:

在 .NET Core 之前,也曾经有一个非常简单的 GUI 来实现这一点。基本上,您需要通过对 SqlServer 身份数据库进行逆向工程来创建 DbContect。 在 .NET 5(Core) 中,您需要在项目的 PackageManager 控制台上使用 Scaffold-DbContext。但是,它并不直观。 尝试创建“模型”作为主项目的一部分时失败。 答案是用一个空类创建一个新项目。然后,在该项目上运行 Scaffold-DbContext。整个反向工程 SqlServer Identity Db 完全建立在该类的模型中。一次性活动!很干净。构建它,然后从主项目中引用它。实际上,比旧方法更快更清洁。

Scaffold-DbContext "Server=win2k22.ladybug.xxxx;initial catalog=xxxxx ;user id=Remotexxx;password=Remotexxx;MultipleActiveResultSets=True;App=EntityFramework&quot;"  Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force

【讨论】:

以上是关于如何在现有数据库 ASP.NET Core MVC 和 EF Core(DB-First)中使用 Identity的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 5 MVC (.NET 5) 中获取记录的用户数据?

如何从现有 SQL DB ASP.Net MVC 4 在下拉列表中填充数据

如何先用asp.net身份框架数据库将asp.net mvc迁移到asp.net core

如何在 Asp.Net Core Mvc 5.0 中将 sql 数据库与 ado.net 连接?

如何在 ASP.NET Core MVC 中请求和显示实时 Web api 数据?

如何在 ASP.NET Core MVC 中使用 select 标签动态编辑数据库表?