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.
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
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
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