EntityFramework6(EF6)连接Postgresql数据库问题总结

目开发中需要将原来SQL Server迁移到PostgreSQL,原来系统中部分DB操作采用了LinqToSQL,由于LinqToSQL无法用于PostgreSQL(网上有linq2db.PostgreSQLDevart LinqConnect.等使用第三方Provider使其支持的方法https://stackoverflow.com/questions/4855095/linq-to-sql-with-postgresql,但太过繁琐,故放弃),  已先将LinqToSQL改为EntityFramework(关于Linq2SQL与EF的部分使用上的区别可见我前面的两篇搜集的文章), EntityFramework可用于SQL Server及其他数据库,但需要相应的Db Provider支持,VS中默认Connect to database只包含Sql Server及Oracle,并无PostgreSQL, 可安装Npgsql PostgreSQL Interaction插件使其支持菜单栏工具下的扩展与更新,找到Npgsql PostgreSQL Interaction插件并安装或者通过npgsql官网https://www.npgsql.org/doc/ddex.html,这样才能在server explorer中连接到postgresql数据库,但实际安装后VS打开server explorer弹错并找不到PostgreSQL数据提供程序,估计官网提供的插件有Bug,并且目前未更新修复,后续或许会Fix,网上找到有开发者针对该问题修复并提供了可用版https://github.com/kenjiuno/Npgsql/releases/tag/v3.2.2  (下载地址:https://github.com/kenjiuno/Npgsql/releases/download/v3.2.2/Npgsql.vsix),经安装后已可在Connect to Database中正确出现PostgreSQL Database的数据源。

 

以下是EntityFramework6(EF6)利用该插件连接Postgresql数据库的使用教程原文

https://blog.csdn.net/danger_z/article/details/80466350

 

EntityFramework6(EF6)连接Postgresql数据库

1.新建一个MVC框架的ASP.NET Web应用程序项目:

2.打开菜单栏工具下的扩展与更新,找到Npgsql PostgreSQL Interaction插件并安装,这样才能在server explorer中连接到postgresql数据库:

 

3.使用Nuget程序包管理器控制台安装连接所需要的Nuget包,输入如下代码:

 
  1. install-package npgsql -version 3.2.7

  2. install-Package EntityFramework6.Npgsql -Version 3.1.1

 

安装完后即可在解决方案管理器的引用下看到如下所添加的引用:

 

 

4.做完这些准备后,接下来开始连接postgresql,打开菜单栏工具下的“连接到数据库”,选择postgresql,输入所要连接的数据库名,完成数据库连接:

 

5.接下来创建一个实体数据模型,选择Models文件夹右击添加/新建项,然后选择数据栏里的ADO.NET实体数据模型:

选择来自数据库的EF设计器,进行如下操作:

 注:连接设置另存为的文件名同时也是后续连接所要创建的类名

模型建立完成后会在Models文件夹下生成Model1.edmx文件,如下:

    

 

6.建立好模型后,我们在建立一个模型的控制器,选择Conteoller文件夹右击添加/控制器,选择空的MVC 5控制器:

 

7.在Web config 里添加如下代码:

<system.data>
    <DbProviderFactories>
      <remove invariant="Npgsql" />
      <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" support="FF" />
    </DbProviderFactories>
  </system.data>
若没有添加则会发生如下错误:

8.在控制器的Index方法里编辑如下代码(以及相应的using语句):

using Test.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
namespace Test.Controllers
{
    public class TestController : Controller
    {
        // GET: Test
        public ActionResult Index()
        {
            Database myDatabase = new Database();
            //查询
            var list = from s in myDatabase.student
                       select s;
            return View(list);
        }
    }
}


9.接着添加一个视图来显示我们查询的数据,鼠标点击View()函数右击添加视图:

10.编辑视图,在<div>里添加table,以及添加相应的引用,代码如下:

@model IQueryable<Test.Models.student>
@using Test.Models
@{
    Layout = null;
}
 
<!DOCTYPE html>
 
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <table border="1">
            <tr>
                <th>学号</th>
                <th>姓名</th>
            </tr>
            @foreach (student s in Model)
            {
                <tr>
                    <td>@s.sno</td>
                    <td>@s.sname</td>
                </tr>
            }
        </table>
    </div>
</body>
</html>

11.最后将默认的控制器改成刚刚我们建立的控制器,编辑App_Start文件夹下的RouteConfig.cs文件,将controlre的参数改成Test(即控制器名),运行即可查看查询结果。

注:若出现依赖错误,可能是因为Nuget包版本问题,只需更新后即可解决

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Test", action = "Index", id = UrlParameter.Optional }
            );

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值