2012-04-12 13 views
6

Ich habe einen brandneuen Server, auf dem ich den .NET 4.5 Beta-Redistributable installiert habe. Ich erhalte eine NotImplemented-Ausnahme, wenn ich versuche, die räumlichen Funktionen zu verwenden. Dieser Code ....NET 4.5 Beta DbGeography NotImplementedException

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

Wirft diese Ausnahme ...

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

Wenn ich die volle VS.NET 11 Beta dann der Code funktioniert einwandfrei installieren. Irgendwelche Ideen warum? Was fehlt?

UPDATE FÜR ANTWORT

Dank Pawel. Sie müssen die SQL CLR-Typen installiert haben. Sie können die 2012-Version unter diesem Link erhalten:

Microsoft® System-CLR-Typen für Microsoft® SQL Server® 2012 http://www.microsoft.com/download/en/details.aspx?id=29065

MEINUNG

ich wirklich nicht verstehen, warum das .NET Framework eine hat Abhängigkeit von SQL Server. An diesen Klassen gibt es nichts Besonderes. Ich weiß, dass dies wahrscheinlich eine historische Sache ist, wo der Code ursprünglich vom SQL-Team geschrieben wurde und das .NET-Team ihn wiederverwenden wollte. Es ist nicht sehr klar, dass dies auch eine Provider-basierte Implementierung ist. Eine bessere Ausnahmemeldung hätte die Arbeit eines Tages gerettet.

+1

Der Grund für die Abhängigkeit ist eigentlich plattformunabhängig. EF stellt dem Benutzer DbGeography- und DbGeometry-Typen (die plattformunabhängig sind) zur Verfügung, aber Datenbanken haben ihre eigenen räumlichen Typen, die sie verstehen. Sql Server hat seine eigenen räumlichen Typen, aber Oracle wird seine eigenen räumlichen Typen haben. Der räumliche Provider muss EF-Spatial-Typen in Typen konvertieren, die von der Datenbank verstanden werden. Da Sie SqlServer verwenden, übersetzt der SqlServer-spezifische räumliche Provider DbGeometry- und DbGeography-Typen in Sql Server-spezifische Typen. Sql Server versteht DbGeography oder DbGeometry nicht. – Pawel

+0

Aber dieser Code verwendet nicht SQL Server; es ist nur eine einzelne Zeile von .NET-Code. Ich interagiere überhaupt nicht mit einer Datenbank. Was, wenn ich eine geospatiale In-Memory-Anwendung erstellen möchte? Warum kann ich das nicht mit .NET machen? – craigtadlock

+0

Das Erstellen der gesamten räumlichen Funktionalität liegt außerhalb des Geltungsbereichs von Entity Framework und es würde kopieren, was bereits vom SqlServer-Team getan wurde. Wir verfügen nicht über das erforderliche Fachwissen und würden diese Zeit lieber für neue Funktionen des Entity Framework verwenden. Wenn Sie räumliche Typen ohne Datenbank verwenden müssen, ist es wahrscheinlich besser, eine spezielle Typbibliothek zu verwenden, die sich ausschließlich auf die räumliche Funktionalität konzentriert. Es wird wahrscheinlich auch besser funktionieren. – Pawel

Antwort

13

DefaultSpatialServices in Entity Framework verwenden SqlGeography- und SqlGeometry-Typen als Backing-Typen. Diese beiden Typen befinden sich in der Microsoft.SqlServer.Types.dll-Assembly, die nicht Teil von .NET Framework ist. Die Ausnahme wird ausgelöst, wenn EF diese Typen nicht finden kann (die Ausnahme könnte hilfreicher sein). Wenn Sie Visual Studio installieren, installiert es localdb auf Ihrem Computer (oder Sie haben möglicherweise bereits eine SqlExpress-Datenbank) und dies ist wahrscheinlich die Art und Weise, wie Sie den Typ auf dem Computer, der funktioniert, erhalten haben. Auf einem Computer, auf dem nur .NET Framework installiert ist und nicht auf Sql Server, sind diese Typen nicht verfügbar. Sie können SqlExpress entweder in der Box installieren, in der Sie die Ausnahme erhalten, oder Sie können versuchen, nur die Typen zu installieren. Ich bin nicht sicher, wo die Assembly selbst zu bekommen, aber ich denke, die Sql Server-Feature-Pack (http://www.microsoft.com/en-us/download/details.aspx?id=27596) kann es haben. Typen von SqlServer 2008 und SqlServer 2012 werden unterstützt, so dass es keine Rolle spielt, welche Version Sie installieren.

EDIT

In EF6 die Ausnahme wird eine bessere Nachricht enthalten siehe: https://entityframework.codeplex.com/SourceControl/changeset/b3eca2c141c0fb517504f9731dc8ba7a9c5727ee

Workitem verwendet diesen Fehler verfolgen: https://entityframework.codeplex.com/workitem/3

+0

Danke! Du hast Recht. Ill aktualisieren Sie die Frage mit der Antwort. – craigtadlock

+0

@Pawel Ich verwende den DbGeography-Typ auf Azure und bin auf dieses Problem gestoßen. Wie installiere ich dies auf einem Azure? Kann ich einfach Microsoft.SqlServer.Types.dll zu meinem Webprojekt hinzufügen? – darwindave

+7

Vergesst nicht. mit nuget Install-Package haben Microsoft.SqlServer.Types den Trick gemacht – darwindave

2

Vielleicht kann jemand darwindaves Antwort markieren:

Installieren Sie das Nuget-Paket Microsoft.SqlServer.Types. Alternativ fügen Sie Verweise auf:

c: \ Programme (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Types.dll und stellen Sie sicher, Kopie lokal in den Eigenschaften zu markieren.

0

Zusätzlich

c zum Hinzufügen: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Types.

dll

ich auch

SqlServerSpatial110.dll

hinzuzufügen benötigt Sobald wir diejenigen, es funktionierte wie ein Zauber hinzugefügt!