【问题标题】:Unable to configure AspNet.Identity using PostgreSQL无法使用 PostgreSQL 配置 AspNet.Identity
【发布时间】:2017-10-27 08:11:30
【问题描述】:

我有一个使用 SQL Server 设置的 Web 项目,现在必须迁移到 PostgreSQL。我正在使用 Entity Framework 6.0 版和最新版本的 Microsoft.AspNet.Identity 来管理用户凭据。我正在使用 VS2015 和 .NET Framework 452。

该项目在 PostgreSQL 服务器上运行良好,除了 AspNet.Identity 之外的所有内容。当我尝试注册新用户或登录时,我收到 this question 中描述的相同错误消息。相同的错误,相同的行,但问题已有 2 年历史,给出的解决方案对我不起作用(我已多次尝试 Add-Migration 和 Update-Database)。

一切正常,我已经检查过了,我的 postgreSQL 数据库确实包含与 AspNet.Identity 相关的任何表,即使它们是在项目使用 SQL Server 时自动创建的。其他与模型相关的表存在并且正在工作。

谢谢。

【问题讨论】:

  • 请用明确的问题陈述写一个问题标题,而不是与问题/问题相关的工具
  • 您是否有一个从 IdentityDbContext 继承的上下文或单独的上下文?尝试为所有对象创建一个主脚本,看看它会产生什么:update-database -Script -SourceMigration: $InitialDatabase
  • 我有不同的上下文,一个用于身份,另一个用于其他所有内容。两个上下文都使用相同的连接字符串,我会试试你说的。谢谢@Steve,抱歉标题改了。
  • 您可能会觉得这很有帮助youtu.be/zNSbYggVX9k

标签: c# .net postgresql entity-framework asp.net-identity


【解决方案1】:

我无法让 Microsoft 的 AspNet.Identity 与 postgresql 一起使用,它似乎被设计为与 SQL Server 一起使用,并且无论您做什么都不承认存在不同的数据上下文配置。

我现在在外部库的帮助下一切正常,所以我会回答我的问题,以防其他人遇到这个问题。

我遵循了以下项目中的说明(感谢 vincechan):

第 2 步有点问题。将项目导入我的解决方案后,我必须解决其中的参考问题。在包管理器控制台中,您可以安装丢失的包和/或更新过时的包。我的最终配置需要使用:

  • Npgsql 3.2.2 在我的主项目上(使用 EntityFramework6.Npgsql
  • Npgsql 2.2.7 在下载的项目上(使用 Npgsql.EntityFramework

一切准备就绪后,添加一个新的迁移 (Add-Migration <migration-name) 并更新您的数据库 (Update-Database)。

现在执行创建身份相关表的 SQL 脚本,它们将不会像 SQL Server 一样自动创建。该脚本包含在项目中(文件PostgreSQLIdentity.sql)。

现在一切都应该正常了。请原谅这个答案的糟糕格式。

【讨论】:

  • 我说。这是一个很好的解决方案。唯一的问题是弄清楚如何在不迁移的情况下运行它。我发现在项目 Nuget 控制台窗口中发出命令 ** Remove-Migration ** 或在 -Net Developer DOS 命令窗口中发出 ** dotnet ef migrations remove ** 有很大帮助。
  • 顺便说一句。这是一个示例连接字符串:'' 标记 SearchPath 部分,您可以在其中指定要使用的架构
【解决方案2】:

如果您的 PostgreSQL 数据库不包含任何与 ASP.NET Identity 相关的表,则很可能意味着没有为 ASP.NET Identity 上下文类启用迁移。就我而言,我使用的是 VS 脚手架,我的意思是这个类:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

所以,第一步是在包管理器控制台中不带参数地运行Enable-Migrations。如果您有一个干净的数据库,那么它将完全按照它在SO topic mentioned earlier 中的工作方式工作。因此,如果您想要一个简单的解决方案,请彻底销毁您的 PostgreSQL 数据库,重新创建它并简单地运行 Enable-Migrations

如果您不想破坏 PostgreSQL 数据库或/和丢失之前完成的任何迁移,那么只需在单独的目录中启用仅适用于 ASP.NET 身份上下文的迁移>。已经有一个SO answer 解释了如何做到这一点。

在某些目录(例如MigrationsIdentity)中为ApplicationDbContext启用迁移:

Enable-Migrations -ContextTypeName MyProject.Models.ApplicationDbContext -MigrationsDirectory MigrationsIdentity

为此上下文添加初始迁移:

Add-Migration IdentityInitial -ConfigurationTypeName MyProject.MigrationsIdentity.Configuration

应用此迁移:

Update-Database -ConfigurationTypeName MyProject.MigrationsIdentity.Configuration

在这些步骤之后,您的 PostgreSQL 数据库中将有 ASP.NET 身份表由 Code First 自动生成,您无需使用 SQL 脚本手动运行任何内容。

在您提到的评论中,您有单独的上下文。但是,多上下文方法有一个缺点:you won't use them together easily。此外,每次迁移数据库时,您都必须使用 -ConfigurationTypeName 标志明确指定上下文。我会像 discussed already 一样使用单一上下文,但这取决于您的任务要求。

版本:

  • 实体框架 6

  • Microsoft.AspNet.Identity.Core 2.1

  • Npgsql 3.1.10.0

  • EntityFramework6.Npgsql 3.1.1.0

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    相关资源
    最近更新 更多