Postgresql с postGIS и инфраструктурой сущностей, проблема ограничения CHECK

У меня есть база данных postgresql с postGIS, и я использую структуру сущностей с dotconnect 6.7 для 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)

но, похоже, он принимает все, как большие, так и маленькие сриды, по какой-то причине.

Это ошибка в postgresql, фреймворке сущностей или dotconnect?

Изменить: запрос

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

возвращает srid 0. Итак, независимо от того, какой srid я указываю в структуре сущностей, он отображается как 0 в базе данных. Что здесь происходит?


person user1815201    schedule 29.07.2013    source источник
comment
postgresql 6.7? Даже не существует Или это dotconnect 6.7? Тогда каковы версии Postgres и PostGis?   -  person Erwin Brandstetter    schedule 01.08.2013
comment
Исправлена ​​формулировка. PostgreSQL 9.2.4 и PostGis 2.0.3 r11132.   -  person user1815201    schedule 02.08.2013
comment
Ну, по крайней мере, на postgresql 9.1 и postgis 1.5 мы видим st_srid = 4326; вы хотите использовать ведение журнала запросов и видеть, что выдает dotconnect   -  person Antti Haapala    schedule 02.08.2013
comment
Я мало что знаю о postgis, но 3 ограничения, все из которых не работают, предполагают, что st_srid может возвращать null   -  person maniek    schedule 05.08.2013
comment
Не уверен, почему st_srid(the_geom) ‹= 4326) оценивается как true, если st_srid оценивается как null?   -  person user1815201    schedule 06.08.2013


Ответы (2)


Существует соответствующий тип геометрии, который следует использовать вместо byte[] на стороне .NET:

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

Вы используете Entity Developer (программу Devart Элемент Entity Model, *.edml), ​​не так ли?

После установки dotConnect для PostgreSQL версии 6.7.287 (или выше) перейдите в Visual Studio > Инструменты > Entity Developer > Параметры > Параметры сервера > PostgreSql и нажмите кнопку Сброс. Это необходимо для того, чтобы новые правила сопоставления были добавлены в ваш список Type Mapping Rules:

  • geography (тип сервера) -> 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, чтобы включить отслеживание активности базы данных: http://www.devart.com/dotconnect/postgresql/docs/?dbmonitor.html.

Дополнительная информация:

  1. Версия SharpMap в вашем проекте должна быть 1.0 RC3 (http://sharpmap.codeplex.com/releases/view/106717). Окончательная версия 1.0 скоро будет поддерживаться в dotConnect для PostgreSQL.
  2. Пожалуйста, используйте Postgis версии 2.0 (или выше). Вы можете проверить версию, выполнив «выбрать postgis_version ()» в базе данных

Соответствующая документация Devart доступна по адресу http://blogs.devart.com/dotconnect/enhanced-entity-framework-spatials-support-for-oracle-mysql-and-postgresql.html.

Это помогает?

person Devart    schedule 06.08.2013
comment
Хм, я получаю, что функция st_geomfromewkt(unknown) не существует в context.SaveChanges(). У меня постгис 2.0 и 1.0 RC3 SharpMap. - person user1815201; 07.08.2013
comment
Вы выполнили все шаги из нашего ответа? Если это не поможет, пришлите нам небольшой тестовый проект для воспроизведения ошибки: devart.com /company/contactform.html . - person Devart; 09.08.2013
comment
Я следовал всем шагам в меру своих возможностей. Тестовый проект отправлен. - person user1815201; 09.08.2013
comment
Это работает в нашей среде. Не могли бы вы указать точный текст сообщения об ошибке, которое вы получаете? Если текст ошибки искажен из-за несоответствия кодировок, добавьте Unicode=true; введите строку подключения (через Tools > Entity Developer > Database Explorer > Edit Connection Properties) и сохраните модель, чтобы обновить файл App.config. Также включите инструмент dbMonitor, чтобы узнать оператор SQL, который не выполняется. - person Devart; 12.08.2013
comment
Согласно dbMonitor, ошибка заключается в том, что функция st_geomfromwkt(unknown) не существует. Неудачный запрос: INSERT INTO x.y(x, y, start_datetime, end_datetime, the_geom) VALUES (:p0, :p1, :p2, :p3, ST_GeomFromEWKT(:p4)) RETURNING idadapter) Где :p4 — p4 Input VarChar SRID=4326;POINT(1 1) - person user1815201; 13.08.2013
comment
Вы создали расширение postgis в своей текущей базе данных? СОЗДАТЬ РАСШИРЕНИЕ postgis; postgis.net/docs/manual-2.0/ - person Devart; 13.08.2013

Если проблема заключается в этих ограничениях, я бы предложил вам воссоздать таблицу. В Postgis 2 вы можете использовать типизированную геометрию. Попробуйте использовать такую ​​таблицу

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

Вы должны поместить код базы данных SQLSTATE, возвращенный из неудачного запроса, чтобы обеспечить лучший ответ.

У меня нет опыта работы с б/у фреймворком.

person cavila    schedule 07.08.2013