如何在现有数据库 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"" 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 连接?