2012-04-12 9 views
6

Ho un server nuovo di zecca su cui ho installato .NET 4.5 Beta ridistribuibile. Ricevo un'eccezione NotImplemented quando provo a utilizzare le funzionalità spaziali. Questo codice ....NET 4.5 Beta DbGeography NotImplementedException

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

genera questa eccezione ...

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

Se installo il pieno VS.NET 11 Beta poi il codice funziona bene. Qualche idea, perché? Che cosa manca?

AGGIORNAMENTO PER RISPOSTA

Grazie a Pawel. È necessario che i tipi CLR SQL siano installati. È possibile ottenere la versione 2012 a questo link:

Tipi Microsoft® System CLR per Microsoft® SQL Server® 2012 http://www.microsoft.com/download/en/details.aspx?id=29065

PARERE

io davvero non capisco perché il framework .NET ha un dipendenza da SQL Server. Non c'è niente di speciale in queste classi. Mi rendo conto che questa è probabilmente una cosa storica in cui il codice è stato originariamente scritto dal team di SQL e il team di .NET ha voluto riutilizzarlo. Non è molto chiaro che si tratti di un'implementazione basata sul provider. Un messaggio di eccezione migliore avrebbe salvato un giorno di lavoro.

+1

Il motivo della dipendenza è in realtà di essere indipendente dalla piattaforma. EF espone i tipi di DbGeography e DbGeometry (che sono indipendenti dalla piattaforma) all'utente, ma i database hanno i loro tipi spaziali che comprendono. Sql Server ha i propri tipi spaziali ma Oracle avrà i propri tipi spaziali. Il provider spaziale deve tradurre tipi spaziali EF in tipi che il database comprende. Poiché si utilizza SqlServer, il provider spaziale specifico SqlServer converte i tipi DbGeometry e DbGeography in tipi specifici di Sql Server. Il server Sql non comprende DbGeography o DbGeometry. – Pawel

+0

Ma quel codice non sta usando SQL Server; è solo una linea di codice .NET. Non sto affatto interagendo con un database. Cosa succede se volevo creare un'applicazione geospaziale in memoria? Perché non posso farlo con solo .NET? – craigtadlock

+0

Costruire l'intera funzionalità spaziale non rientra nell'ambito di Entity Framework e copierà ciò che è già stato fatto dal team di SqlServer. Non disponiamo dell'esperienza e preferiremmo trascorrere questo tempo su nuove funzionalità di Entity Framework. Se è necessario utilizzare tipi spaziali senza database, sarà preferibile utilizzare una libreria di tipi specializzata che si concentra esclusivamente sulle funzionalità spaziali. Probabilmente funzionerà anche meglio. – Pawel

risposta

13

DefaultSpatialServices in Entity Framework utilizzano i tipi SqlGeography e SqlGeometry come tipi di supporto. Questi due tipi vivono nell'assembly Microsoft.SqlServer.Types.dll che non fa parte di .NET Framework. L'eccezione viene generata quando EF non riesce a trovare questi tipi (l'eccezione potrebbe essere più utile ...). Quando installi Visual Studio, installerà localdb sulla tua macchina (o potresti già avere un database SqlExpress) e questo è probabilmente il modo in cui hai ottenuto il tipo sulla macchina che sta funzionando. Su una macchina in cui è installato solo .NET Framework e non su Sql Server non si avranno questi tipi. È possibile installare SqlExpress nella casella in cui si ottiene l'eccezione oppure provare a installare solo i tipi. Non sono sicuro di dove ottenere l'assembly stesso, ma penso che il pacchetto di funzionalità Sql Server (http://www.microsoft.com/en-us/download/details.aspx?id=27596) possa averlo. I tipi da SqlServer 2008 e SqlServer 2012 sono supportati in modo che non importi la versione installata.

EDIT

Nel EF6 eccezione conterrà un messaggio vedere meglio: voce https://entityframework.codeplex.com/SourceControl/changeset/b3eca2c141c0fb517504f9731dc8ba7a9c5727ee

lavoro utilizzato per tenere traccia questo bug: https://entityframework.codeplex.com/workitem/3

+0

Grazie! Hai ragione. Ill aggiorno la domanda con la risposta. – craigtadlock

+0

@Pawel Sto utilizzando il tipo DbGeography su Azure e ho riscontrato questo problema. Come installarlo su un Azure.?Posso includere Microsoft.SqlServer.Types.dll nel mio progetto web? – darwindave

+7

Nevermind. utilizzando il pacchetto di installazione di nuget Microsoft.SqlServer.Types ha fatto il trucco – darwindave

2

Forse qualcuno può evidenziare darwindaves risposta:

Installare il pacchetto nuget Microsoft.SqlServer.Types. In alternativa, aggiungere riferimenti a:

c: \ Programmi (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Types.dll e assicurarsi di contrassegnare la copia locale nelle proprietà.

0

Oltre ad aggiungere

c: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Types.dll

Ho anche bisogno di aggiungere

SqlServerSpatial110.dll

Una volta che abbiamo aggiunto quelle ha funzionato come un fascino!