postgresql与postGIS和实体框架,CHECK约束问题

use*_*201 6 postgresql entity-framework devart dotconnect

我有一个postgresql数据库与postGIS,我使用实体框架与dotconnect 6.7 for postgreSQL.

使用我的数据库中的下表:

CREATE TABLE geo 
(
  the_geom geometry,
  id integer NOT NULL,
  CONSTRAINT primary_key PRIMARY KEY (id),
  CONSTRAINT enforce_srid_geometry CHECK (st_srid(the_geom) = 4326)
)
Run Code Online (Sandbox Code Playgroud)

并运行以下代码

class Program {
    static void Main(string[] args) {
        using (test_Model.test_Entities ctx = new test_Model.test_Entities()) {
            var geom = new test_Model.geo();
            geom.id = 0;
            geom.the_geom = DbGeometry.PointFromText("POINT (1 1)", 4326).AsBinary();
            ctx.geos.AddObject(geom);
            ctx.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下约束在数据库中失败

CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326)
Run Code Online (Sandbox Code Playgroud)

对数据库注册的值感到好奇,我尝试了以下两个约束

CONSTRAINT enforce_srid_the_geom CHECK(st_srid(the_geom) > 4326)
CONSTRAINT enforce_srid_the_geom CHECK(st_srid(the_geom) < 4326)
Run Code Online (Sandbox Code Playgroud)

都没有奏效.由于这些是比较的整数值,因此最后三个查询中的至少一个应该是真的.

过了一会儿,我发现以下约束允许我将srid = 4326插入到表中

st_srid(the_geom) <= 4326)
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,它似乎接受了所有东西,包括更大和更小的s ..

这是postgresql,实体框架还是dotconnect中的错误?

编辑:查询

SELECT st_srid(the_geom) FROM geo WHERE geo.id == 0
Run Code Online (Sandbox Code Playgroud)

返回srid 0.因此,无论我在实体框架中指定什么srid,它在数据库中显示为0.到底是怎么回事?

Dev*_*art 6

在.NET端应该使用相应的几何类型而不是byte []:

  1. EntityFramework.dll v6中的.NET 4.0 - > System.Data.Entity.Spatial.DbGeometry
  2. System.Data.Entity.dll中的.NET 4.5 - > System.Data.Spatial.DbGeometry

您正在使用Entity Developer(Devart Entity Model项目,*.edml),不是吗?

安装dotConnect for PostgreSQL v 6.7.287(或更高版本)后,导航到Visual Studio>工具>实体开发人员>选项>服务器选项> PostgreSql,然后按"重置"按钮.这是必要的,以便将新的映射规则添加到"类型映射规则"列表中:

  • 地理位置(服务器类型) - > Data.Spatial.DbGeography(.NET Type)
  • geometry(服务器类型) - > Data.Spatial.DbGeometry(.NET Type)

现在从模型中删除Geo实体,然后将geo表从Tools> Entity Developer> Database Explorer拖放到图表面.打开工具>实体开发人员>模型资源管理器,确保geomentry属性的类型为:

  • SSDL中的spatial_geometry
  • CSDL中的几何

保存模型.

将此条目添加到您的app.config:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="GeoAPI" publicKeyToken="a1a0da7def465678" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.7.1.0" newVersion="1.7.1.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
Run Code Online (Sandbox Code Playgroud)

运行以下代码:

class Program {
    static void Main(string[] args) {

        // new Devart.Data.PostgreSql.PgSqlMonitor() { IsActive = true };

        var config = Devart.Data.PostgreSql.Entity.Configuration.PgSqlEntityProviderConfig.Instance;
        config.SpatialOptions.SpatialServiceType = Devart.Data.PostgreSql.Entity.Configuration.SpatialServiceType.NetTopologySuite;

        using (test_Model.test_Entities ctx = new test_Model.test_Entities()) {
            var geom = new test_Model.geo();
            geom.id = 0;
            geom.the_geom = DbGeometry.PointFromText("POINT (1 1)", 4326);
            ctx.geos.AddObject(geom);
            ctx.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

我们建议使用dbMonitor工具来启用数据库活动的跟踪:http: //www.devart.com/dotconnect/postgresql/docs/dbmonitor.html.

附加信息:

  1. 项目中SharpMap的版本应为1.0 RC3(http://sharpmap.codeplex.com/releases/view/106717).很快,dotConnect for PostgreSQL将支持1.0 Final版本
  2. 请使用2.0(或更高版本)的Postgis.您可以通过在数据库中执行"select postgis_version()"来检查版本

相应的Devart文档可从http://blogs.devart.com/dotconnect/enhanced-entity-framework-spatials-support-for-oracle-mysql-and-postgresql.html获得.

这有帮助吗?