2

提供 .NET Standard 2.1 版本的 EF6 的目的被理解为是协助分阶段升级现有项目。

所以我们有一个由网站、Windows 服务和控制台应用程序组成的现有解决方案。我们正在将其从 .NET Framework 升级到 .NET Core。

最好让它在 .NET Core 中再次运行,但目前仍使用 .NET Standard 2.1 版本的 EF6。

EF6 模型派生自IdentityDbContext以便包含用户、角色等的身份存储。

public class DbContextTasking : IdentityDbContext<AspNetUser, AspNetRole, string, AspNetUserLogin, AspNetUserRole, AspNetUserClaim>

所有代码现在都在 .NET Core 或 .NET Standard 程序集中。

升级后的 Windows 服务和控制台应用程序基本上可以正常工作,但是我们在网站上苦苦挣扎。

尽管令人担忧的是,为了让数据层程序集编译一些 packageReferences 是必要的,它们在解决方案资源管理器中显示黄色三角形警告:

<PackageReference Include="Microsoft.AspNet.Identity.EntityFramework" Version="2.2.3" />

“包 x 是使用 .NET Framework 4.6.1 恢复的……这个包可能不完全兼容……”

暂时忽略这些警告,表演者正在了解如何获得一个带有身份、身份验证和授权的 ASP.NET Core 网站,以使用 EF6。

例如,显示 EF Core 用法的示例在其ConfigureServices功能中有:

services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

但是'.UseSqlServer'来自程序集Microsoft.EntityFrameworkCore.SqlServer

还有:

services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<DbContextTasking>()
                .AddDefaultTokenProviders();

AddEntityFrameworkStores再次与 EF Core 存储相关。

例如 2

这个包形成了 ASP.NET Core 和身份基础设施之间的桥梁:

Microsoft.AspNetCore.Identity.EntityFrameworkCore

所以有人会认为,要让 EF6 与 ASP.NET Core 一起工作,需要有一个本质上相似的包(组成名称)Microsoft.AspNetCore.Identity.EntityFramework6

如果可以将 EF6.4(包括身份相关表)与 ASP.NET Core 结合使用,请您指出实现此目的的示例吗?

或者,如果您知道这种组合绝对不可能,也请告诉我。

4

1 回答 1

2

ASP.NET Core Identity 不支持 EF6;您只能使用 EF Core。微软喜欢随意地建议,只要 EF Core 有一些不足(而且经常有很多不足),你总是可以只使用 EF6,但自 .NET Core 诞生以来仍然存在这种明显的支持真空。

你有三个选择:

  1. 在需要 ASP.NET Core Identity 支持的地方使用 EF Core。您必须复制一些代码,但您可以拥有一个 EF Core 上下文和一个 EF 6 上下文,它们都连接到同一个数据库。您应该只将一端或另一端(很可能是 EF Core 端)视为数据库优先,因此不要从那里运行迁移。但是,由于 ASP.NET Core Identity 与 ASP.NET Identity 从根本上不同,您需要将任何现有的 Identity 表替换/迁移到 Core 版本,然后关闭 ASP.NET Identity 的任何使用。换句话说,您必须独占选择其中一个。

  2. ASP.NET Core Identity 在技术上可以与任何数据源一起使用。EF Core 就是开箱即用的东西。如果您有时间和意愿,您可以使用任何您想要的技术来实现自定义商店。这是一项艰巨的任务,但如果这是您需要的,则可以实现。

  3. 您可以使用像 Identity Server 这样的集中式身份验证提供程序。这实质上抽象了身份验证层,因此应用程序是在 ASP.NET 还是 ASP.NET Core 中并不重要。但是,Identity Server 4 仅与 ASP.NET Core Identity 和 EF Core 原生集成(本质上是相同的问题)。有一个旧版本的 Identity Server 是为 ASP.NET 构建的,但我不知道它的状态(是否仍然受支持、维护等),或者您是否可以使用 ASP.NET Core 使其工作坦率地说,如果您的目标是 .NET Framework 和 .NET Core 之间的交叉兼容,我会选择 Azure AD 或 Auth0 之类的东西,它们都可以使用。它们在大多数情况下也是即插即用的,而 Identity Server 需要更多的麻烦。

于 2020-03-31T19:03:01.683 回答