无法使用PostgreSQL

时间:2017-05-26 12:19:52

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

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

该项目适用于PostgreSQL服务器,除了AspNet.Identity之外的所有内容。当我尝试注册新用户或登录时,我会收到 this question 中描述的相同错误消息。相同的错误,相同的行,但问题是2年,给出的解决方案对我不起作用(我多次尝试添加迁移和更新数据库)。

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

谢谢。

2 个答案:

答案 0 :(得分:4)

我无法使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)。

现在一切都应该有效。原谅这个答案的格式不佳。

答案 1 :(得分:2)

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

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

因此,第一步是在没有参数的Package Manager Console中运行Enable-Migrations。如果你有一个干净的数据库,那么它将完全适用于SO topic mentioned earlier中的工作方式。因此,如果您想要一个简单的解决方案,那么完全销毁您的PostgreSQL数据库,再次创建它并只需运行Enable-Migrations

如果您不想破坏PostgreSQL数据库或/并且在此之前丢失任何迁移,只需在单独目录中启用仅针对ASP.NET标识上下文的迁移 / strong>即可。已经有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,但这取决于您的任务要求。

版本:

  • EntityFramework 6

  • Microsoft.AspNet.Identity.Core 2.1

  • Npgsql 3.1.10.0

  • EntityFramework6.Npgsql 3.1.1.0