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

时间:2013-07-29 10:33:13

标签: entity-framework postgresql 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)
)

并运行以下代码

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();
    }
}

以下约束在数据库中失败

CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326)

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

CONSTRAINT enforce_srid_the_geom CHECK(st_srid(the_geom) > 4326)
CONSTRAINT enforce_srid_the_geom CHECK(st_srid(the_geom) < 4326)

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

过了一会儿,我发现以下约束允许我在表格中插入srid = 4326的东西

st_srid(the_geom) <= 4326)

但由于某些原因,它似乎接受了所有东西,包括较大和较小的srids。

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

编辑: 查询

SELECT st_srid(the_geom) FROM geo WHERE geo.id == 0

返回srid 0.因此,无论我在实体框架中指定什么srid,它在数据库中显示为0。 发生了什么事?

2 个答案:

答案 0 :(得分:6)

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

  1. .NET 4.0 - &gt; EntityFramework.dll v6中的System.Data.Entity.Spatial.DbGeometry
  2. .NET 4.5 - &gt; System.Data.Entity.dll中的System.Data.Spatial.DbGeometry
  3. 您正在使用Entity Developer(Devart Entity Model项目,* .edml),不是吗?

    安装dotConnect for PostgreSQL v 6.7.287(或更高版本)后,导航到Visual Studio&gt;工具&gt;实体开发人员&gt;选项&gt;服务器选项&gt; PostgreSql并按下Reset按钮。这是必要的,以便将新的映射规则添加到“类型映射规则”列表中:

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

    现在从模型中删除Geo实体,然后从“工具”&gt;中拖放地理位置表。实体开发人员&gt;数据库资源管理器到图表面打开工具&gt;实体开发人员&gt; Model 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>
    

    运行以下代码:

    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();
        }
    }
    

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

    其他信息:

    1. 项目中的SharpMap版本应为1.0 RC3 (http://sharpmap.codeplex.com/releases/view/106717)。 1.0决赛 版本将很快支持dotConnect for PostgreSQL
    2. 请使用2.0(或更高版本)的Postgis。你可以检查一下 通过在数据库
    3. 中执行“select postgis_version()”来获得该版本

      http://blogs.devart.com/dotconnect/enhanced-entity-framework-spatials-support-for-oracle-mysql-and-postgresql.html提供了相应的Devart文档。

      这有帮助吗?

答案 1 :(得分:1)

如果问题是那些限制,我建议你重新创建表格。在Postgis 2中,您可以使用键入的几何体。 尝试使用这样的表

CREATE TABLE geo 
(
  the_geom geometry(POINT,4326), -- the constraints are here --
  id integer NOT NULL
);

您应该从失败的查询中返回数据库SQLSTATE代码,以便更好地响应。

我没有使用过框架的经验。