2013-07-29 19 views
6

Mam bazę danych postgresql z postGIS i używam framework entity z dotconnect 6.7 dla postgreSQL.Postgresql z postGIS i strukturą encji, problem ograniczenia CHECK

Z poniższej tabeli w mojej bazy danych:

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) 
) 

i uruchomiony następujący kod

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

następujące ograniczenia zawodzi w bazie

CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326) 

ciekawa jaką wartość baza danych zarejestrowana, próbowałem mieć następujące dwa ograniczenia

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

Żaden nie zadziałał. Ponieważ są to wartości całkowite, które są porównywane, co najmniej jedno z ostatnich trzech zapytań powinno być prawdziwe.

Po pewnym czasie okazało się, że następujące ograniczenie pozwala mi wkładać coś z SRID = 4326 do tabeli

st_srid(the_geom) <= 4326) 

ale wydaje się akceptować wszystko, zarówno większych i mniejszych srids, z jakiegoś powodu.

Czy jest to błąd w postgresql, encji framework lub dotconnect?

Edit: Zapytanie

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

zwraca SRID 0. Tak więc, bez względu na to, co Srid daję określić w ramach podmiotu, wydaje się jako 0 w bazie danych. Co się dzieje?

+0

'postgresql 6.7'? [Nawet nie istnieje.] (Http://www.postgresql.org/support/versioning/) A może to jest to, że dotconnect 6.7? Więc jakie są wersje Postgres i PostGis? –

+0

Naprawiono sformułowanie. PostgreSQL 9.2.4 i PostGis 2.0.3 r11132. – user1815201

+0

Cóż, przynajmniej na postgresql 9.1 i postgis 1.5, widzimy st_srid = 4326; chciałbyś użyć rejestrowania zapytań i zobaczyć, co jest wypluwane przez dotconnect –

Odpowiedz

6

nie jest odpowiedni typ geometrii, które powinny być stosowane zamiast bajt [] na stronie NET:

  1. NET 4,0 -> System.Data.Entity.Spatial.DbGeometry w EntityFramework.dll V6
  2. .NET 4.5 -> System.Data.Spatial.DbGeometry w System.Data.Entity.dll

używasz Entity Developer (element Devart Podmiot modelu, * .edml), ​​prawda?

Po zainstalowaniu dotConnect dla PostgreSQL w wersji 6.7.287 (lub nowszej), przejdź do Visual Studio> Narzędzia> Entity Developer> Opcje> Serwery Options> PostgreSql i naciśnij przycisk Reset. Jest to konieczne, aby nowe zasady mapowania zostały dodane do listy Typ mapowania zasad:

  • geografia (Typ serwera) -> Data.Spatial.DbGeography (.NET Type)
  • geometria (Typ serwera) - > Data.Spatial.DbGeometry (.NET Type)

teraz usunąć podmiot Geo od modelu i przeciągnij & usunąć tabelę z geo Narzędzia> Entity programisty> Database Explorer diagram powierzchnię.Otwarte Narzędzia> Podmiot Developer> model Explorer i upewnij się, że typ własności geomentry jest:

  • spatial_geometry w SSDL
  • Geometria w CSDL

zapisać modelu.

Dodaj ten wpis do 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> 

Uruchom następujący kod:

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

Zalecamy używanie dbMonitor tool aby umożliwić śledzenie aktywności bazy danych: http://www.devart.com/dotconnect/postgresql/docs/?dbmonitor.html.

Dodatkowe informacje:

  1. Wersja SharpMap w projekcie powinno być 1.0 RC3 (http://sharpmap.codeplex.com/releases/view/106717). Wersja 1.0 końcowa będzie obsługiwana w dotConnect dla PostgreSQL wkrótce
  2. Proszę stosować Postgis wersji 2.0 (lub wyższej). Można sprawdzić wersję za pomocą „wybierz postgis_version()” w bazie danych

Odpowiednia dokumentacja Devart jest dostępny na http://blogs.devart.com/dotconnect/enhanced-entity-framework-spatials-support-for-oracle-mysql-and-postgresql.html.

Czy to pomaga?

+0

Hm, otrzymuję "funkcja st_geomfromewkt (nieznana) nie istnieje" w context.SaveChanges(). Mam postgis 2.0 i 1.0 SharpMap RC3. – user1815201

+0

Stacktrace dla powyższego problemu: http://pastebin.com/kTJu6wCF – user1815201

+0

Czy wykonałeś wszystkie kroki z naszej odpowiedzi? Jeśli to nie pomoże, prześlij nam mały projekt testowy do odtworzenia błędu: http://www.devart.com/company/contactform.html. – Devart

1

Jeśli problemem są te ograniczenia, proponuję odtworzyć tabelę. W Postgis 2 możesz użyć wpisanej geometrii. Spróbuj użyć tabeli jak to

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

Należy umieścić kod SQLSTATE bazie wrócił z nieudanej zapytania, aby umożliwić lepszą odpowiedź.

Nie mam doświadczenia w używanym frameworku.

Powiązane problemy