在 ASP.NET MVC 中使用 Entity Framework 和 PostgreSQL






4.89/5 (13投票s)
在本博文中,我们将学习如何在 ASP.NET MVC 应用程序中使用 Entity Framework 和 PostgreSQL。
引言
我想快速研究在 ASP.NET MVC 应用程序中使用 Entity Framework 和 PostgreSQL。 我没有编写一个简单的演示,只是从数据库读取和写入数据,而是决定更好的方法是将一个已经使用 Entity Framework(使用另一个数据库)的现有 ASP.NET MVC 应用程序转换为使用 PostgreSQL。 我决定使用 MvcMusicStore。 它是 ASP.NET MVC 应用程序中最好的文档教程之一。 这是其项目网站上的描述:“MVC Music Store 是一个基于 ASP.NET MVC 构建的教程应用程序。 这是一个轻量级的示例商店,演示了使用 Entity Framework 的 ASP.NET MVC”。
通过转换一个可以正常工作的应用程序,我可以专注于特定于使用 Entity Framework 和 PostgreSQL 的领域。 我还可以通过运行应用程序轻松地执行基本测试来验证我所做的更改。 本文的其余部分记录了我转换 MvcMusicStore
所经历的步骤。
您将需要
- PostgreSQL 的工作安装。 我使用 PostgreSQL 版本 9.3
- 您可以编译和运行 ASP.NET MVC 应用程序的开发环境
步骤 1
下载 MvcMusicStore。 解压缩该文件夹并打开项目。 此时,您应该能够编译该项目。 如果没有,则您的开发环境存在问题,请在进行更多可能使情况复杂化的更改之前解决它。 该项目配置为使用 SqServerCe。 如果已安装,您应该能够运行该应用程序。
第二步
准备 PostgreSQL 数据库。
MvcMusicStore
使用 EntityFramework Code First。
在 global.asax.cs 文件中,它指定 SampleData
类作为数据库初始化程序。
protected void Application_Start()
{
// specify database initializer
System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
看看 SampleData
类,注意它继承自 DropCreateDatabaseIfModelChanges。 这意味着当架构更改时,应用程序将重新创建并重新填充数据库。
// inherits from DropCreateDatabaseIfModelChanges
public class SampleData : DropCreateDatabaseIfModelChanges
{
// The seed method will seed the database with initial data
protected override void Seed(MusicStoreEntities context)
{
var genres = new List
{
new Genre { Name = "Rock" },
new Genre { Name = "Jazz" },
new Genre { Name = "Metal" },
new Genre { Name = "Alternative" },
new Genre { Name = "Disco" },
new Genre { Name = "Blues" },
new Genre { Name = "Latin" },
new Genre { Name = "Reggae" },
new Genre { Name = "Pop" },
new Genre { Name = "Classical" }
};
// more code not shown here .......
不幸的是,Npgsql Entity Framework 还不支持数据库迁移和创建。 我们必须手动创建数据库并播种数据。
- 在您的 PostgreSQL 服务器中创建一个数据库。 将数据库命名为
MvcMusicStore
。 - 接下来,我们需要创建表并用数据填充它们。
MvcMusicStore
下载包含一个适用于 MSSQL 的 \MvcMusicStore-Assets\Data\MvcMusicStore-Create.sql 文件。 我们可以使用它作为基础并使其适应 postgreSQL。 您可以在此处使用完成的脚本 MvcMusicStore-Create-PostgreSQL。 该文件包含有关原始脚本更改内容的文档。
步骤 3
为 postgreSQL 安装 ADO.NET 提供程序和 Entity Framework 提供程序。
MvcMusicStore
下载使用 EntityFramework 4.1,它比当前版本(Entity Framework 6)早两个版本。 让我们首先通过 Nuget 将其升级到最新版本。
Install-Package EntityFramework
接下来,安装 Npgsql PostgreSQL Entity Framework 提供程序。 这也将安装其依赖项,其中包括 Npgsql ADO.NET 提供程序。
Install-Package Npgsql.EntityFramework
步骤 4
更新 web.config 以告诉运行时我们的数据库连接和 Entity Framework 配置。
- 更新连接字符串,如下所示。 记住将连接字符串中的信息替换为您环境的值。
<connectionStrings> <add name="MusicStoreEntities" connectionString="Server=[myserver];Database=MusicStore; User Id=[myusername];Password=[mypassword];" providerName="Npgsql" /> </connectionStrings>
注意:不要更改连接字符串名称的名称。 名称
MusicStoreEntities
与项目的DbContext
类名匹配。 Entity Framework 就是这样找出要使用的连接字符串的。 - 按如下方式更新
entityFramework
元素<entityFramework> <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory>--> <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" /> </providers> </entityFramework>
- 按如下方式添加
system.data
元素<system.data> <DbProviderFactories> <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" /> </DbProviderFactories> </system.data>
步骤 5
修改 MvcStoreEntities
(DbContext
) 类以配置实体映射到的表名。
默认情况下,PostgreSQL 在公共模式中创建数据表。 这与默认的 Entity Framework 约定不同。 覆盖 OnModelCreating
方法以指定新的表名映射。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("Artist", "public");
modelBuilder.Entity().ToTable("Album", "public");
modelBuilder.Entity().ToTable("Cart", "public");
modelBuilder.Entity().ToTable("Order", "public");
modelBuilder.Entity().ToTable("OrderDetail", "public");
modelBuilder.Entity().ToTable("Genre", "public");
}
步骤 6
注释掉 global.asax.cs 文件中的以下行。 否则,您会收到错误,因为 Npgsql 不支持迁移和数据库创建。
//System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData());
最后
再次编译并运行该应用程序。 您现在正在运行使用 Entity Framework 6 对抗 postgreSQL 数据库的 MvcMusicStore
。