2012-04-12 20 views
6

Tengo un nuevo servidor en el que instalé el .NET 4.5 Beta redistribuible. Obtengo una excepción NotImplemented cuando trato de usar las características espaciales. Este código ....NET 4.5 Beta DbGeography NotImplementedException

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

emite esta excepción ...

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

Si instalo el pleno VS.NET 11 Beta entonces el código funciona bien. ¿Alguna idea de por qué? ¿Lo que falta?

ACTUALIZACIÓN DE RESPUESTA

Gracias a Pawel. Necesita tener instalados los tipos CLR de SQL. Puede obtener la versión de 2012 en este enlace:

Tipos CLR sistema de Microsoft® para Microsoft® SQL Server® 2012 http://www.microsoft.com/download/en/details.aspx?id=29065

OPINIÓN

realmente no entiendo por qué el marco .NET tiene una dependencia en SQL Server. No hay nada especial acerca de estas clases. Me doy cuenta de que esto es probablemente algo histórico donde el código fue escrito originalmente por el equipo SQL y el equipo .NET quiso reutilizarlo. No está muy claro que esta sea una implementación basada en proveedores tampoco. Un mejor mensaje de excepción habría ahorrado un día de trabajo.

+1

El motivo de la dependencia es en realidad ser independiente de la plataforma. EF expone los tipos de DbGeography y DbGeometry (que son independientes de la plataforma) para el usuario, pero las bases de datos tienen sus propios tipos de espacio que entienden. El servidor Sql tiene sus propios tipos espaciales, pero Oracle tendrá sus propios tipos espaciales. El proveedor espacial necesita traducir tipos espaciales EF a tipos que la base de datos comprenda. Como está utilizando SqlServer, el proveedor espacial específico SqlServer traduce los tipos DbGeometry y DbGeography a los tipos específicos de servidores Sql. Sql Server no comprende DbGeography o DbGeometry. – Pawel

+0

Pero ese código no usa SQL Server; es solo una sola línea de código .NET. No estoy interactuando con una base de datos en absoluto. ¿Qué pasa si quiero construir una aplicación geoespacial en memoria? ¿Por qué no puedo hacer eso solo con .NET? – craigtadlock

+0

Crear toda la funcionalidad espacial está fuera del alcance de Entity Framework y estaría copiando lo que ya ha hecho el equipo de SqlServer. No tenemos la experiencia y preferimos gastar este tiempo en nuevas características del Entity Framework. Si necesita utilizar tipos espaciales sin base de datos, probablemente sea mejor utilizar una biblioteca de tipos especializada que se centre únicamente en la funcionalidad espacial. Probablemente también se desempeñe mejor. – Pawel

Respuesta

13

DefaultSpatialServices en Entity Framework utilizan los tipos SqlGeography y SqlGeometry como tipos de respaldo. Estos dos tipos viven en el ensamblado Microsoft.SqlServer.Types.dll que no forma parte de .NET Framework. La excepción se produce cuando EF no puede encontrar estos tipos (la excepción podría ser más útil ...). Cuando instale Visual Studio, instalará localdb en su máquina (o puede que ya tenga una base de datos SqlExpress) y esta es probablemente la forma en que obtuvo el tipo en la máquina que está funcionando. En una máquina donde solo está instalado .NET Framework y no en Sql Server, no tendrá estos tipos. Puede instalar SqlExpress en el cuadro donde obtiene la excepción o puede intentar instalar solo los tipos. No estoy seguro de dónde obtener el ensamblaje en sí, pero creo que el paquete de características del servidor Sql (http://www.microsoft.com/en-us/download/details.aspx?id=27596) puede tenerlo. Los tipos de SqlServer 2008 y SqlServer 2012 son compatibles, por lo que no debería importar qué versión instale.

EDITAR

En EF6 la excepción contendrá un mensaje mejor ver: artículo https://entityframework.codeplex.com/SourceControl/changeset/b3eca2c141c0fb517504f9731dc8ba7a9c5727ee

de trabajo se utilizan para realizar un seguimiento de este error: https://entityframework.codeplex.com/workitem/3

+0

¡Gracias! Estás en lo correcto. Ill actualizar la pregunta con la respuesta. – craigtadlock

+0

@Pawel Estoy usando el tipo de DbGeography en Azure y me he encontrado con este problema. ¿Cómo instalo esto en un Azure? ¿Puedo simplemente incluir Microsoft.SqlServer.Types.dll en mi proyecto web? – darwindave

+7

No importa. using nuget Install-Package Microsoft.SqlServer.Types hizo el truco – darwindave

2

Tal vez alguien puede resaltar darwindaves respuesta:

Instalar el paquete nuget Microsoft.SqlServer.Types. Como alternativa, agregue referencias a:

c: \ Archivos de programa (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Types.dll y asegúrese de marcar copy local en las propiedades.

0

Además de añadir

c: \ Archivos de programa (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Types.DLL

También tenía que añadir

SqlServerSpatial110.dll

Una vez que hemos añadido los funcionó como un encanto!

Cuestiones relacionadas