2013-07-29 31 views
6

私はpostGISでpostgresqlデータベースを持っていますが、PostgreSQL用にdotconnect 6.7でエンティティフレームワークを使用しています。postGISとエンティティフレームワーク、CHECK制約の問題を伴う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) 
) 

と何の価値について次の制約がデータベースに

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

を実行している:私のデータベースに次の表では

データベースを登録しましたが、次の2つの制約がありました。

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

どちらも機能しません。これらは比較される整数値なので、最後の3つのクエリの少なくとも1つが真であったはずです。

は、しばらくして、私は次の制約は私がテーブル

st_srid(the_geom) <= 4326) 

にSRID = 4326で何かを挿入できますが、いくつかの理由のためにすべて、両方の大小のSRIDを、受け入れるように見えることがわかりました。

これはpostgresql、エンティティフレームワーク、またはdotconnectのバグですか?

編集: クエリ

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

だからSRID 0を返し、関係なく、私は、エンティティフレームワークで指定与える何SRID、それがデータベースに0として表示されません。 何が起こっていますか?

+0

'postgresql 6.7'? [存在していない。](http://www.postgresql.org/support/versioning/)または、dotconnect 6.7ですか?次に、PostgresとPostGisのバージョンは何ですか? –

+0

文言が修正されました。 PostgreSQL 9.2.4およびPostGis 2.0.3 r11132です。 – user1815201

+0

少なくとも、postgresql 9.1とpostgis 1.5では、st_srid = 4326が表示されています。クエリのロギングを使用し、dotconnectによって吐き出されているものが何であるかを確認したい –

答えて

6

[] .NET側の代わりにバイトを使用する必要があり、対応するジオメトリタイプがある:

  1. .NET 4.0 - > System.Data.Entity.Spatial.DbGeometry EntityFramework.dll V6
  2. では
  3. .NET 4.5 - あなたは、Entity Developer(Devartエンティティモデル項目、* .edml)を使用している

System.Data.Entity.dll中> System.Data.Spatial.DbGeometryはあなたではありませんか?

PostgreSQL v 6.7.287(またはそれ以上)用にdotConnectをインストールした後、Visual Studio>ツール>エンティティデベロッパー>オプション>サーバーオプション> PostgreSqlに移動し、リセットボタンを押します。新しいマッピングルールがあなたのタイプのマッピングルールリストに追加されたように、これは必要です:

  • 地理(サーバータイプ) - > Data.Spatial.DbGeography(.NETタイプ)
  • ジオメトリ(サーバータイプ) - > Data.Spatial.DbGeometry(.NETタイプ)

今、あなたのモデルからジオエンティティを削除し、&は表面をダイアグラムに[ツール]> [エンティティの開発>データベースエクスプローラから地理テーブルをドラッグ&ドロップ。オープンツール]> [エンティティの開発>モデルエクスプローラと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> 

を実行し、次のコード:http://www.devart.com/dotconnect/postgresql/docs/?dbmonitor.html

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を使用することをお勧めします。

追加情報:

  1. SharpMapのバージョンプロジェクトには1.0 RC3 (http://sharpmap.codeplex.com/releases/view/106717)でなければなりません。 1.0の最終 バージョンは、すぐにPostgreSQLのdotConnectでサポートされます
  2. 2.0(またはそれ以上)バージョンのPostgisを採用してください。あなたは、対応するDevartのドキュメントがhttp://blogs.devart.com/dotconnect/enhanced-entity-framework-spatials-support-for-oracle-mysql-and-postgresql.htmlで利用可能であるデータベースに「)(postgis_versionを選択し、」実行することにより、

を バージョンを確認することができます。

これは役に立ちますか?

+0

私はcontext.SaveChanges()で "関数st_geomfromewkt(不明)が存在しません"を取得しています。 私はpostgis 2.0と1.0 RC3 SharpMapを持っています。 – user1815201

+0

上記の問題のスタックトレース:http://pastebin.com/kTJu6wCF – user1815201

+0

返信のすべての手順を実行しましたか?これで問題が解決しない場合は、エラーを再現するための小さなテストプロジェクト、http://www.devart.com/company/contactform.htmlをお送りください。 – Devart

1

問題がこれらの制約である場合は、テーブルを再作成することをお勧めします。 Postgis 2では、入力されたジオメトリを使用できます。 この

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

のようなテーブルを使用してくださいあなたは、データベースのSQLSTATEコードは良好な応答を可能にするために失敗したクエリから返さ置く必要があります。

私は使用しているフレームワークについての経験はありません。

関連する問題