EF框架操作postgresql,实现WKT类型坐标的插入,查询,以及判断是否相交

1.组件配置

首先,要下载.NET for Postgresql的驱动,npgsql,EF6,以及EntityFramework6.Npgsql,版本号 3.1.1.0.

由于是mvc项目,所以,把相应的配置文件写在web.config里面,如下:

1  <configSections>
2     <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
3     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
4   </configSections>

由于项目数据的存储是用的MongoDB,此代码段必须添加在<configuration>标签下的第一个子节点,是对EF框架的引入声明.

<!--EF框架与Npgsql整合-->
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v13.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
    </providers>
  </entityFramework>

此段配置是EF框架与npgsql的整合。

<system.data>
  <!--注册npgSql组件-->
   <DbProviderFactories>
     <remove invariant="Npgsql" />
     <add name="Npgsql" invariant="Npgsql" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
      <add name="dotConnect for PostgreSQL" invariant="Devart.Data.PostgreSql" description="Devart dotConnect for PostgreSQL" type="Devart.Data.PostgreSql.PgSqlProviderFactory, Devart.Data.PostgreSql, Version= 7.7.804.0, Culture=neutral, PublicKeyToken=09af7300eec23701"/>
    </DbProviderFactories>
  </system.data>

此段配置,是对npgsql组件的注册,缺失的话会报npgsql未注册的异常。

用nuget直接下载上述组件,这些都应该会自动生成配置文件,我之前是因为写了一个控制台程序进行尝试,mvc项目里的组件

都是直接引用的控制台程序里面的。

 <!--Postgresql数据库的字符串连接信息-->
  <connectionStrings>
    <add name ="db" connectionString ="Server=localhost;Port=5432;Database=db;User Id=postgres;Password=123456;" providerName="Npgsql"/>
  </connectionStrings>

连接信息需要自己添加,不会生成。

2.  数据库连接

这里遇到了一个问题,明明配置文件中密码写的没问题,读到后台代码中时,ConnectString里总是没有密码,于是乎用笨方法,在c#代码里面自己在重写一遍ConnectString

  public class dbFactory : DbContext
 2     {
 3         public dbFactory(string databaseName, bool isDoInitialize = false)
 4             : base(databaseName)
 5         {
 6             if (!isDoInitialize)
 7             {
 8                 Database.Connection.Open();
 9                 Database.Connection.ConnectionString = "Server=127.0.0.1;Port=5432;Database=db;User Id=postgres;Password=123456";
10
11                 Database.SetInitializer<dbFactory>(null);
12
13
14
15             }
16         }
17
18
19
20
21
22         //public DbSet<Destination> Destination { set; get; }
23         public DbSet<PuKouMap> PuKouMap
24         {
25             set;
26             get;
27
28         }
29         public DbSet<Judyment> Judyment { set; get; }
30     }

而且必须要自己手动打开连接,否则初始化后连接状态一直是Closed,不知道有什么更好的方法。

 1 [Table("PuKouMapDb", Schema = "public")]
 2    public class PuKouMap
 3     {
 4         [Key]
 5         public int Id { set; get; }
 6         public int Type { set; get; }
 7         public string ObjectId { set; get; }
 8         public string Polygon { set; get; }
 9         public string ZipName { set; get; }
10         public string FilePath { set; get; }
11         public string FileNames { set; get; }
12         public string ObjectName { set; get; }
13     }

要在实体类上面加一个注解,实体类对应表名写上,因为在sqlsever默认的架构师dbo,postgresql却是public,所以在这要改一下。

 1 public class BaseDao
 2     {
 3         public static dbFactory db = null;
 4        /// <summary>
 5        /// 派生类实例化时加载基类构造函数,进行数据库连接
 6        /// </summary>
 7         static BaseDao()
 8         {
 9             db = new dbFactory("db");
10
11         }
12         #region 得到建立连接后的数据操作接口
13         public  dbFactory getDb() {
14
15
16            return db;
17         }
18         #endregion
19     }
 1  public class QueryString
 2     {
 3
 4         public static  string Insert(PuKouMap p) {
 5          String  InsertAction = "INSERT INTO public.‘PuKouMapDb‘ VALUES("+p.Type+","+p.ObjectId+","+"st_GeomFromText(" +"‘"+ p.Polygon  +"‘"+",4326)"+","+p.ZipName+","+p.FilePath+","+p.FileNames+","+p.ObjectName+";)";
 6             return InsertAction;
 7         }
 8         #region 断句加空格
 9         public static string GetPoKouMapByObjectIdString(String ObjectId) {
10
11             String CheckAction = "SELECT a.\"Id\",a.\"Type\",a.\"ObjectId\",ST_ASTEXT(a.\"Polygon\") AS \"Polygon\",a.\"ZipName\",a.\"FilePath\",a.\"FileNames\",a.\"ObjectName\" "
12             +"from public.\"PuKouMapDb\" as a "+
13               "where "
14              +"a.\"ObjectId\"=‘"+ObjectId+"‘";
15
16             return CheckAction;
17         }
18         #endregion
19         public static string IsIntersects(String PolygonNew,String Geometry) {
20
21             string IsIntersectsAction =  "SELECT ST_Intersects(st_GeomFromText(" + "‘" + PolygonNew + "‘)" + "," +"‘"+ Geometry +"‘" +") AS \"TrueOrFalse\"";
22             return IsIntersectsAction;
23         }
24
25
26
27         }

postgresql的sql语句必须要注意的地方就是表名和字段名必须要加双引号,所以用了转义字符,插入直接用EF框架提供的Add(),方法就行了,会以坐标系缺省的情况插入进去.查询要用到ST_ASTEXT函数进行geometry类型向文本类型的转换,语句用EF框架的sqlQuery执行(感觉还不如用原生方法,做geomoetry分析,都必须用到postgis的空间分析函数,必须要写sql)

判断是否相交则用ST_Intersects函数对两个geometry类型进行判断,返回值是一个bool类型,由于EF框架没有找到衔接postgresql的操作,返回值貌似只有对象,所以自己写了一个bool值实体类。

 public class Judyment
    {
        [Key]

        public bool TrueOrFalse { set; get; }
    }

相当于是一个存放结果的容器。应当注意sql语句中必须要写一个相同别名对应实体名。

新人发文,还请各位大佬指正。

时间: 2024-10-14 10:26:03

EF框架操作postgresql,实现WKT类型坐标的插入,查询,以及判断是否相交的相关文章

ASP.NET MVC+EF框架+EasyUI实现权限管理系列

http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也要感谢大家了,因这个 项目我已经上传了,得到了很多网友的评价,也有好多人发邮件给我说这个框架容易出现问题,不能访问,这也是支持我写这个系列的动力,我将这个项目写成一个 系列

ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也要感谢大家了,因这个项目我已经上传了,得到了很多网友的评价,也有好多人发邮件给我说这个框架容易出现问题,不能访问,这也是支持我写这个系列的动力,我将这个项目写成一个系列,可能要很长时间吧,但是我肯定会一直坚持,如果我哪里写的不好欢迎大家指出我们共同学习,而且我理解的也不是很透彻,所以我想在写这样一遍

Asp.net Core基于MVC框架实现PostgreSQL操作

简单介绍 Asp.net Core最大的价值在于跨平台.跨平台.跨平台.重要的事情说三遍.但是目前毕竟是在开发初期,虽然推出了1.0.0 正式版,但是其实好多功能还没有完善.比方说编译时的一些文件编码问题,辅助工具Tools的一些Bug,还有一些好用的模板和平台实现尚未完成等一些问题.但这毕竟是一个好的开始,并且在Github上,大家都还在积极的完善,你也可以参与进来.地址:https://github.com/aspnet Asp.net Core在学习的时候,首先你应该跟着微软官方的入门教材

EF框架step by step(7)—Code First DataAnnotations(1)

Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data annotation特性来配置类和属性的某些特性. 其实在前面的几篇文章中,有用到几个,在这一篇里,进行一次比较全面的介绍 Key EF框架要求每个实体必须有主键字段,他需要根据这个主键字段跟踪实体.CodeFirst方法在创建实体时,也必须指定主键字段,默认情况下属性被命名为ID.id或者[Clas

MVC + EF 框架 对数据库做增删改查

这几天一直在看MVC 开发模式,其中借助EF框架对数据库进行 增删改查操作 现在就小小的总结一下吧 在使用EF操作数据库时,会首先添加 ADO.NET数据模型,这时,会为我们添加一个数据上下文类,使用这个类的对象可以对数据库做任何操作.所以在使用EF操作数据库之前 需要创建数据上下文对象. MyDatabaseEntities mde = new MyDatabaseEntities(); 1.使用EF 对数据库 做增加操作 1.1 创建一个需要被操作数据表的对象(一般来说 ,一张表就是一个实体

【.NET】EF框架之三种模式

使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题. 第一,它是谁? 第二,从哪里来? 第三,到哪里去? 默念一遍:不谋全局者,不足谋一域. 今天老师宏观给讲了一下EF的好处,抛出为什么要用EF的问题,我们的回答仅仅是概念和技术上的浅显的认识,老师的话我并未全部理解.先来整理一下自己所认识的EF吧. Entity Framework是ORMapping的一种具体实现,那ORMapping又是什么呢?ORM--ObjectRelation Mapping,即对象关系映

C# CodeFirst(EF框架)代码优先创建数据库

namespace WebEF.Model{ public class ModelContext:DbContext //继承DBcontext 来自EF框架 { public ModelContext() : base("name=配置文件名") { //读取配置文件 /*配置文件的设置格式 <connectionStrings> <add name="配置文件名" connectionString="Data Source=(. .l

.net EF框架 MySql实现实例

1.nuget中添加包EF和MySql.Data.Entity 2.config文件添加如下配置 1.配置entitframework节点(一般安装EF时自动添加) <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <

PDF.NET框架操作——工具应用(一)

PDF.NET是个开源的项目其解决UI层(WinForm / Web)控件数据绑定.映射与查询: BLL层实体对象查询(OQL):DAL层SQL语句和.NET数据访问代码映射(查看  SQL-MAP 原理):由于其工具是VB语言开发,个人将他翻成C#版本,仅供学习和交流,对于初学者和C#初学者有一定能够帮助:有不足之处大家尽管拍砖,下面进入正题: 程序界面 大致思路 通过数据库连接查询所有表名-->根据表中列名.描述及字段类型生成实体类对应的属性-->根据项目需求实体类样式生成文件 所需控件