gpt4 book ai didi

entity-framework - 带有 postGIS 和 Entity Framework 的 Postgresql,CHECK 约束问题

转载 作者:行者123 更新时间:2023-11-29 11:24:26 28 4
gpt4 key购买 nike

我有一个带有 postGIS 的 postgresql 数据库,我正在使用 Entity Framework 和用于 postgreSQL 的 dotconnect 6.7。

在我的数据库中有下表:

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、 Entity Framework 或 dotconnect 中的错误吗?

编辑:查询

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

返回 srid 0。因此,无论我在 Entity Framework 中指定什么 srid,它在数据库中都显示为 0。这是怎么回事?

最佳答案

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

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

您正在使用 Entity Developer (Devart 实体模型项,*.edml),不是吗?

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

  • 地理(服务器类型)-> Data.Spatial.DbGeography(.NET 类型)
  • 几何(服务器类型)-> Data.Spatial.DbGeometry(.NET 类型)

现在从您的模型中删除 Geo 实体,并将地理表从 Tools > Entity Developer > Database Explorer 拖放到图表表面。打开 Tools > Entity Developer > Model Explorer 并确保 geomentry 属性的类型是:

  • SSDL 中的空间几何
  • 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。你可以检查通过在数据库中执行“select postgis_version()”来选择版本

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

这有帮助吗?

关于entity-framework - 带有 postGIS 和 Entity Framework 的 Postgresql,CHECK 约束问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921778/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com