2013-07-29 9 views
6

Ho un database postgresql con postGIS e sto utilizzando il framework di entità con dotconnect 6.7 per postgreSQL.Postgresql con postGIS e framework di entità, problema di vincolo CHECK

Con la seguente tabella nel mio database:

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

e l'esecuzione del seguente codice

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

il seguente vincolo fallisce nel database

CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 4326) 

curioso a quale valore della database registrato, ho provato ad avere i seguenti due vincoli

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

Nessuno dei due ha funzionato. Poiché questi sono valori interi da confrontare, almeno una delle ultime tre query avrebbe dovuto essere vera.

Dopo un po 'ho trovato che il seguente vincolo mi permette inserisco qualcosa con SRID = 4326 nella tabella

st_srid(the_geom) <= 4326) 

ma sembra accettare tutto, sia SRID grandi e piccoli, per qualche ragione.

Si tratta di un bug in postgresql, entità framework o dotconnect?

Edit: La query

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

restituisce lo srid 0. Quindi, non importa quello che srid dò specificare in Entity Framework, appare come 0 nel database. Cosa sta succedendo?

+0

'postgresql 6.7'? [Non esiste nemmeno.] (Http://www.postgresql.org/support/versioning/) O è dotconnect 6.7? Allora quali sono le versioni Postgres e PostGis? –

+0

Risolto il problema. PostgreSQL 9.2.4 e PostGis 2.0.3 r11132. – user1815201

+0

Beh, almeno su postgresql 9.1 e postgis 1.5, stiamo visualizzando st_srid = 4326; dovresti usare la registrazione delle query e vedere qualsiasi cosa venga sputata da dotconnect –

risposta

6

C'è il tipo corrispondente geometria che dovrebbe essere utilizzato al posto del byte [] sul lato NET:

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

si utilizza Entity Developer (la voce Devart modello entità, * .edml), ​​non è vero?

Dopo aver installato dotConnect per PostgreSQL v 6.7.287 (o successivo), accedere a Visual Studio> Strumenti> Sviluppatore entità> Opzioni> Opzioni server> PostgreSql e premere il pulsante Ripristina. Ciò è necessario in modo che le nuove regole di mappatura sono stati aggiunti al vostro tipo di lista regole di mapping:

  • geografia (Tipo di server) -> Data.Spatial.DbGeography (tipo NET)
  • geometria (Tipo di server) - > Data.Spatial.DbGeometry (tipo NET)

Ora rimuovere l'entità Geo dal modello e trascinare & eliminare la tabella geo da Strumenti> Entity Developer> Database Explorer allo schema di superficie.Aprire Strumenti> Entity Developer> Modello Explorer e assicurarsi che il tipo di proprietà forma geometrica è:

  • spatial_geometry in SSDL
  • Geometria in CSDL

salvare il modello.

Aggiungi questa voce il vostro 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> 

eseguire il codice seguente:

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

Si consiglia di utilizzare il dbMonitor tool attivare l'analisi della attività del database: http://www.devart.com/dotconnect/postgresql/docs/?dbmonitor.html.

Ulteriori informazioni:

  1. La versione del SharpMap nel progetto dovrebbe essere 1.0 RC3 (http://sharpmap.codeplex.com/releases/view/106717). La versione 1.0 finale sarà presto supportata in dotConnect per PostgreSQL
  2. Si prega di utilizzare Postgis versione 2.0 (o successiva). È possibile controllare la versione eseguendo "selezionare postgis_version()" nel database

La documentazione Devart corrispondente è disponibile presso http://blogs.devart.com/dotconnect/enhanced-entity-framework-spatials-support-for-oracle-mysql-and-postgresql.html.

Questo aiuto?

+0

Hm, sto ricevendo "la funzione st_geomfromewkt (sconosciuto) non esiste" al context.SaveChanges(). Ho postgis 2.0 e 1.0 RC3 SharpMap. – user1815201

+0

Stacktrace per il problema precedente: http://pastebin.com/kTJu6wCF – user1815201

+0

Hai seguito tutti i passaggi della nostra risposta? Se questo non aiuta, inviaci un piccolo progetto di test per riprodurre l'errore: http://www.devart.com/company/contactform.html. – Devart

1

Se il problema riguarda quei vincoli, suggerirei di ricreare la tabella. In Postgis 2 puoi usare la geometria digitata. Prova Usa una tabella come questa

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

Si dovrebbe mettere il codice del database SQLSTATE restituiti dalla query non è riuscito a consentire una risposta migliore.

Non ho esperienza nel framework utilizzato.

Problemi correlati