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,最近 ...
随机推荐
- Visual Studio 2013进行单元测试
使用Visual Studio 2013进行单元测试--初级篇 1.打开VS2013 --> 新建一个项目.这里我们默认创建一个控制台项目.取名为UnitTestDemo 2.在解决方案里面 ...
- 2.4 LINQ中使用where子句指定筛选条件
本篇讲解的内容有: 使用where筛选过滤LINQ查询 带逻辑的where筛选 多个where筛选子句 [1.使用where筛选过滤LINQ查询] 通常一个LINQ查询不会如前面的示例代码这么简单,经 ...
- [译]Java 设计模式之迭代器
(文章翻译自java-design-pattern-iterator) 迭代器模式用于迭代遍历一个集合对象.它是一个经常被用到的模式,你可能以前使用过它.不管在任何时候你看见一些方法像hasNext( ...
- 安装Windows2003操作系统 - 初学者系列 - 学习者系列文章
Windows 2003是一款经典的服务器操作系统.以前笔者工作的时候就是用的这款操作系统来进行编程的.下面就对该操作系统的安装进行介绍(部分步骤参见XP的安装http://www.cnblogs.c ...
- ThoughtWorks Merchant's Guide To The Galaxy
ThoughtWorks笔试题之Merchant's Guide To The Galaxy解析 一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天H ...
- SQL Server中如何备份存储过程(SP)和函数(Fun)
考虑到安全因素,我们经常需要对数据库的存储过程(SP)和函数(Fun)进行备份 下面提供了一种简单的方式, 存储过程(SP)SQL代码如下: select p.name as SpName,m.def ...
- Android之LinkedHashMap实现LRU
先看下LinkedHashMap的数据结构图 对于LinkedHashMap而言,它继承与HashMap.底层使用哈希表与双向链表来保存所有元素.其基本操作与父类HashMap相似,它通过重写父类相关 ...
- HAProxy+apache实现web服务动静分离
HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支 ...
- 【值得收藏】数据分析和可视化软件IDL的学习资料汇编【可免费下载】
IDL学习教程 IDL 是一种数据分析和图像化应用程序及编程语言,最初在七十年代后期用于帮助科学家分析火星探险卫星发回的数据.此后,IDL得到广泛运用,使用者日众.IDL能使用户可以迅速且方便地运用此 ...
- 在线压缩JS的工具
给大家介绍款在线压缩JS的工具 首先说下该工具的域名:http://javascriptcompressor.com/ 进入后界面如下: 具体要讲下它的功能点:在线压缩 Javascript 源码可以 ...