如何将 ASP.net 身份移动到其他上下文

How to move ASP.net identity to other context

目前我有两个数据库上下文,一个是我创建的 CompetentieContext,另一个仅供 ASP.net 的身份框架使用,名为 ApplicationDBContext

我需要在相同的上下文中同时使用两者,但我不知道如何将我的 CompetentieContext 迁移到 ApplicationDBContext 或反之亦然。

我需要在相同的上下文中使用它们,因为我需要 link ASP.net 用户的 GUID 到我数据库中的 Table。

这就是我的上下文 class 的样子:

public class CompetentieContext : DbContext 
{
    public DbSet<Werknemer> Werknemer { get; set; }
    public DbSet<Competentie> Competentie { get; set; }
    public DbSet<CompetentieWerknemer> CompetentieWerknemer { get; set; }
    public DbSet<CompetentieWerknemerDetail> CompetentieWerknemerDetail { get; set; }
    public DbSet<Tag> Tag { get; set; }
    public DbSet<TagGroupTag> TagGroupTag { get; set; }
    public DbSet<TagGroup> TagGroup { get; set; }
    public DbSet<CompetentieTag> CompetentieTag { get; set; }

}

首先在您自己的数据库中创建一个名为 WebUsers(或类似名称)的 table。它应该是这样的:

CREATE TABLE [dbo].[WebUsers](
    [Id] [uniqueidentifier] NOT NULL,
    [SomeColumnName] [nvarchar](255) NOT NULL,
    [FkSomethingInYourOwnDb] [uniqueidentifier] NULL,
    [WebUserId] [nvarchar](128) NOT NULL,
    ...
  CONSTRAINT [PK_WebUsers] PRIMARY KEY CLUSTERED ([Id] ASC) ON [PRIMARY]
) ON [PRIMARY]

注意 [WebUserId] 列映射到 [AspNetUsers] 主键列。

现在,在更新您的 EF model/context 之后(这取决于您使用的 approach),创建一个名为 IWebUserContext 的抽象及其实现 HttpWebUserContext

public interface IWebUserContext
{
    string Id { get; }
}

public class HttpWebUserContext : IWebUserContext
{
    public string Id => HttpContext.Current.User.Identity.GetUserId();
}

接下来您可以创建自己的上下文抽象,我们称之为 ICompetentieUserContext:

public interface ICompetentieUserContext
{
    WebUserModel CurrentUser { get; }
}

其中 WebUserModel 是我们刚刚创建的 EF 实体。

这个抽象的实现完全取决于你,因为我不知道你的应用程序的架构。但是,例如,您可以使用 Dependency InjectionIWebUserContext 注入 ICompetentieUserContext 的实现中。

您也可以将 EF dbcontext 直接注入到您的实现中(尽管我更喜欢使用某种 Repository 模式),并映射当前 WebUserContextId到您数据库中的那个。