6

.NET 4.5 Beta 再頒布可能パッケージをインストールした新しいサーバーがあります。空間機能を使用しようとすると、NotImplemented 例外が発生します。このコード...

var x = DbGeography.PointFromText(string.Format("POINT({0} {1})", -45, 45), 4326);

この例外をスローします...

System.NotImplementedException: The method or operation is not implemented.
at System.Data.Spatial.DefaultSpatialServices.GeographyPointFromText(String geographyText, Int32 spatialReferenceSystemId)

完全な VS.NET 11 Beta をインストールすると、コードは正常に動作します。理由はありますか?何が欠けている?

回答の更新

パヴェルに感謝します。SQL CLR 型をインストールする必要があります。2012 バージョンは、次のリンクから入手できます。

Microsoft® SQL Server® 2012 の Microsoft® System CLR タイプ http://www.microsoft.com/download/en/details.aspx?id=29065

意見

.NET フレームワークが SQL Server に依存している理由がよくわかりません。これらのクラスについて特別なことは何もありません。これは、コードが最初に SQL チームによって作成され、.NET チームがそれを再利用したいと考えた歴史的なものである可能性が高いことを認識しています。これがプロバイダーベースの実装であることも明確ではありません。より良い例外メッセージがあれば、1 日の作業を節約できたでしょう。

4

4 に答える 4

15

Entity FrameworkのDefaultSpatialServicesは、バッキングタイプとしてSqlGeographyタイプとSqlGeometryタイプを使用しています。これらの2つのタイプは、.NETFrameworkの一部ではないMicrosoft.SqlServer.Types.dllアセンブリに存在します。EFがこれらのタイプを見つけることができない場合、例外がスローされます(例外の方が役立つ場合があります...)。Visual Studioをインストールすると、マシンにlocaldbがインストールされます(または、既にSqlExpressデータベースがある場合もあります)。これは、動作しているマシンでタイプを取得する方法である可能性があります。.NET Frameworkのみがインストールされており、SQL Serverがインストールされていないマシンでは、これらのタイプはありません。例外が発生したボックスにSqlExpressをインストールするか、タイプのみをインストールしてみることができます。アセンブリ自体をどこで入手できるかわかりませんが、SQL Server機能パック(http://www.microsoft.com/en-us/download/details.aspx?id=27596)にある可能性があります。SqlServer2008およびSqlServer2012のタイプがサポートされているため、インストールするバージョンは関係ありません。

編集

EF6では、例外にはより適切なメッセージが含まれます。https ://entityframework.codeplex.com/SourceControl/changeset/b3eca2c141c0fb517504f9731dc8ba7a9c5727ee

このバグの追跡に使用される作業項目:https ://entityframework.codeplex.com/workitem/3

于 2012-04-12T21:13:10.073 に答える
2

おそらく、誰かがdarwindavesの答えを強調することができます:

Nuget パッケージ Microsoft.SqlServer.Types をインストールします。または、次への参照を追加します。

c:\Program Files(x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll プロパティでコピー ローカルをマークしてください。

于 2013-07-09T21:36:27.783 に答える