EF框架操作postgresql,实现WKT类型坐标的插入,查询,以及判断是否相交
1.组件配置
首先,要下载.NET for Postgresql的驱动,npgsql,EF6,以及EntityFramework6.Npgsql,版本号 3.1.1.0.
由于是mvc项目,所以,把相应的配置文件写在web.config里面,如下:
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</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
{
public dbFactory(string databaseName, bool isDoInitialize = false)
: base(databaseName)
{
if (!isDoInitialize)
{
Database.Connection.Open();
Database.Connection.ConnectionString = "Server=127.0.0.1;Port=5432;Database=db;User Id=postgres;Password=123456"; Database.SetInitializer<dbFactory>(null); }
} //public DbSet<Destination> Destination { set; get; }
public DbSet<PuKouMap> PuKouMap
{
set;
get; }
public DbSet<Judyment> Judyment { set; get; }
}
而且必须要自己手动打开连接,否则初始化后连接状态一直是Closed,不知道有什么更好的方法。
 [Table("PuKouMapDb", Schema = "public")]
    public class PuKouMap
     {
         [Key]
         public int Id { set; get; }
         public int Type { set; get; }
         public string ObjectId { set; get; }
         public string Polygon { set; get; }
         public string ZipName { set; get; }
         public string FilePath { set; get; }
         public string FileNames { set; get; }
         public string ObjectName { set; get; }
     }
要在实体类上面加一个注解,实体类对应表名写上,因为在sqlsever默认的架构师dbo,postgresql却是public,所以在这要改一下。
public class BaseDao
{
public static dbFactory db = null;
/// <summary>
/// 派生类实例化时加载基类构造函数,进行数据库连接
/// </summary>
static BaseDao()
{
db = new dbFactory("db"); }
#region 得到建立连接后的数据操作接口
public dbFactory getDb() { return db;
}
#endregion
}
public class QueryString
{ public static string Insert(PuKouMap p) {
String InsertAction = "INSERT INTO public.'PuKouMapDb' VALUES("+p.Type+","+p.ObjectId+","+"st_GeomFromText(" +"'"+ p.Polygon +"'"+",4326)"+","+p.ZipName+","+p.FilePath+","+p.FileNames+","+p.ObjectName+";)";
return InsertAction;
}
#region 断句加空格
public static string GetPoKouMapByObjectIdString(String ObjectId) { String CheckAction = "SELECT a.\"Id\",a.\"Type\",a.\"ObjectId\",ST_ASTEXT(a.\"Polygon\") AS \"Polygon\",a.\"ZipName\",a.\"FilePath\",a.\"FileNames\",a.\"ObjectName\" "
+"from public.\"PuKouMapDb\" as a "+
"where "
+"a.\"ObjectId\"='"+ObjectId+"'"; return CheckAction;
}
#endregion
public static string IsIntersects(String PolygonNew,String Geometry) { string IsIntersectsAction = "SELECT ST_Intersects(st_GeomFromText(" + "'" + PolygonNew + "')" + "," +"'"+ Geometry +"'" +") AS \"TrueOrFalse\"";
return IsIntersectsAction;
} }
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语句中必须要写一个相同别名对应实体名。
新人发文,还请各位大佬指正。
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 正式版,但是其实好多功能还没有完善.比方说编译时的一些文件编码 ... 
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-5项目数据库操作封装操作-EF框架
		EF框架有三种基本的方式:DB First(数据库优先),Model First(模型优先),Code First(代码优先). Entity Framework4.1之前EF支持“Database ... 
- EF框架step by step(7)—Code First DataAnnotations(1)
		Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
		原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改
		原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ... 
- ASP.NET MVC+EF框架+EasyUI实现权限管理(附源码)
		前言:时间很快,已经快到春节的时间了,这段时间由于生病,博客基本没更新,所以今天写一下我们做的一个项目吧,是对权限的基本操作的操作,代码也就不怎么说了,直接上传源码和图片展示,下面我们直接进入主题介绍 ... 
- EF框架之——Code First以及踩过的这些“坑”
		传送门 Code First使用步骤 Code First报错和解决办法 以前在上海做了一段时间的Asp.net,基本用的都是.net自带的EF框架连接数据库,不过都是用的Model First,最近 ... 
随机推荐
- OSG(OpenSceneGraphcow.osg)配置笔记
			OpenSceneGraph是一款高性能的3D图形开发库.广泛应用在可视化仿真.游戏.虚拟现实.高端技术研发以及建模等领域.使用标准的C++和OpenGL编写而成,可以运行在Windows系列.OSX ... 
- 2.2 LINQ中使用from子句指定数据源
			数据源是LINQ查询中必不可少的元素,数据源是实现泛型接口IEnumerable<T>或IQueryable<T>的类对象. 可以将IEnumerable<T>简单 ... 
- 使用JasperReport+iReport进行Web报表开发
			使用JasperReport+iReport进行Web报表开发 前言 在实际工程中非常,报告是其中很重要的一部分,结果以报表的形式呈现出来.这里所提到的报表可不是简单的二维表,而是拥有复杂表头的.多维 ... 
- css优先级机制说明
			原文:css优先级机制说明 首先说明下样式的优先级,样式有三种: 1. 外部样式(External style sheet) 示例: <!-- 外部样式 bootstrap.min.css -- ... 
- hibernate 获取实体的表名、主键名、列名(转载+修改)
			package com.escs.utils; import java.util.Iterator; import org.hibernate.cfg.AnnotationConfiguration; ... 
- 如何在网页启动Windows服务
			由于公司有许多windows服务进行业务的处理,所以对服务的维护也是一个比较头痛的问题,因为自己也不知道服务什么时候自动停了,而且更主要的原因是服务都是由运维部门在维护管理,开发这边没有直接操作服务的 ... 
- 获得WCF Client端的本地端口
			获得WCF Client端的本地端口 最近需要做个小功能,当WCF调用远程服务时,显示该调用的网速或流量.其中比较关键的一步就是需要获得WCF Client端的本地端口,原来以为是个简单的事情,结果 ... 
- MVC 5.1的遭遇:“已添加了具有相同键的项”
			ASP.NET MVC 3升级至MVC 5.1的遭遇:“已添加了具有相同键的项” 最近将一个项目从ASP.NET MVC 3升级至刚刚发布的ASP.NET MVC 5.1,升级后发现一个ajax请 ... 
- iOS基础 - 静态库
			一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系 ... 
- uva 305 Joseph
			点击打开链接uva 305 思路: 数学+打表 分析: 1 传统的约瑟夫问题是给定n个人和m,每次数m次把当前这个人踢出局,问最后留下的一个人的编号 2 这一题是前k个人是好人,后面k个是坏人.现在要 ... 
