如何将 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 Injection 将 IWebUserContext
注入 ICompetentieUserContext
的实现中。
您也可以将 EF dbcontext 直接注入到您的实现中(尽管我更喜欢使用某种 Repository 模式),并映射当前 WebUserContext
的 Id
到您数据库中的那个。
目前我有两个数据库上下文,一个是我创建的 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 Injection 将 IWebUserContext
注入 ICompetentieUserContext
的实现中。
您也可以将 EF dbcontext 直接注入到您的实现中(尽管我更喜欢使用某种 Repository 模式),并映射当前 WebUserContext
的 Id
到您数据库中的那个。