我有一个使用SQL Server设置的Web项目,现在必须迁移到PostgreSQL。我正在使用实体框架版本 6.0 和最新版本的 Microsoft.AspNet.Identity 来管理用户凭据。我使用的是VS2015和.NET Framework 452。
该项目适用于PostgreSQL服务器,除了AspNet.Identity之外的所有内容。当我尝试注册新用户或登录时,我收到与此问题中描述的相同的错误消息。同样的错误,同样的行,但问题是 2 年前的,给出的解决方案对我不起作用(我已经多次尝试添加迁移和更新数据库)。
其他一切都有效,我已经检查过了,我的postgreSQL数据库不包含任何与AspNet.Identity相关的表,即使它们是在项目使用SQL Server时自动创建的。其他与模型相关的表存在并正常工作。
谢谢。
我无法使Microsoft的AspNet.Identity与postgresql一起使用,它似乎被设计为与SQL Server一起使用,并且无论您做什么都不承认存在不同的数据上下文配置。
我现在在外部库的帮助下一切正常,因此如果其他人遇到此问题,我将为我的问题提供答案。
我按照以下项目中的说明进行操作(归功于Vincechan):
- PostgreSQL.AspNet.Identity.EntityFramework on github.com
第 2 步有点问题。将项目导入我的解决方案后,我必须解决其中的参考问题。在程序包管理器控制台中,可以安装缺少的程序包和/或更新已过期的程序包。我的最终配置需要使用:
- 我的主项目上的Npgsql 3.2.2(使用EntityFramework6.Npgsql)
- 下载项目上的Npgsql 2.2.7(使用Npgsql.EntityFramework)
准备好一切后,添加新的迁移(Add-Migration <migration-name
)并更新数据库(Update-Database
)。
现在执行创建与标识相关的表的 SQL 脚本,它们不会像使用 SQL Server 那样自动创建。脚本包含在项目中(文件PostgreSQLIdentity.sql
)。
现在一切都应该正常了。请原谅这个答案的格式不佳。
如果您的 PostgreSQL 数据库不包含任何与 ASP.NET 身份相关的表,则很可能意味着未为 ASP.NET 身份上下文类启用迁移。就我而言,我正在使用 VS 脚手架,我的意思是这个类:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
因此,第一步是在包管理器控制台中运行不带参数的Enable-Migrations
。如果您有一个干净的数据库,那么它将完全按照前面提到的 SO 主题的工作方式工作。因此,如果您想要一个简单的解决方案,请完全销毁您的PostgreSQL数据库,再次创建它并简单地运行Enable-Migrations
。
如果您不想销毁 PostgreSQL 数据库或/并丢失之前完成的任何迁移,则只需在单独的目录中仅为ASP.NET 身份上下文启用迁移即可。已经有一个SO答案解释了如何做到这一点。
在某些目录中启用迁移(例如MigrationsIdentity
) 对于ApplicationDbContext
:
Enable-Migrations -ContextTypeName MyProject.Models.ApplicationDbContext -MigrationsDirectory MigrationsIdentity
为此上下文添加初始迁移:
Add-Migration IdentityInitial -ConfigurationTypeName MyProject.MigrationsIdentity.Configuration
应用此迁移:
Update-Database -ConfigurationTypeName MyProject.MigrationsIdentity.Configuration
完成这些步骤后,PostgreSQL 数据库中将有Code First 自动生成的 ASP.NET 标识表,您无需使用 SQL 脚本手动运行任何内容。
在评论中,您提到您有单独的上下文。但是,多上下文方法有一个缺点:您不会轻松地将它们一起使用。此外,每次迁移数据库时,还必须使用-ConfigurationTypeName
标志显式指定上下文。我会使用已经讨论过的单一上下文,但这取决于您的任务要求。
版本:
实体框架 6
Microsoft.AspNet.Identity.Core 2.1
Npgsql 3.1.10.0
实体框架6.Npgsql 3.1.1.0