2012-04-12 3 views
6

У меня есть новый сервер, на котором я устанавливал бета-версию .NET 4.5. При попытке использовать пространственные функции я получаю исключение NotImplemented. Этот код ....NET 4.5 Beta DbGeography NotImplementedException

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, то код работает отлично. Любые идеи почему? Чего не хватает?

ОБНОВЛЕНИЕ ДЛЯ ОТВЕТА

Благодаря Pawel. Необходимо установить типы SQL CLR. Вы можете получить версию 2012 по этой ссылке:

Типы Microsoft® System CLR для Microsoft® SQL Server® 2012 http://www.microsoft.com/download/en/details.aspx?id=29065

МНЕНИЕ

Я действительно не понимаю, почему рамки .NET имеет зависимости от SQL Server. В этих классах нет ничего особенного. Я понимаю, что это, вероятно, историческая вещь, когда код был первоначально написан командой SQL, а команда .NET хотела его повторно использовать. Не совсем ясно, что это также реализация на основе провайдеров. Лучшее сообщение об исключении спасло бы дневную работу.

+1

Причина зависимости фактически не зависит от платформы. EF предоставляет пользователям DbGeography и DbGeometry типы (которые являются агностическими для платформы), но базы данных имеют свои собственные пространственные типы, которые они понимают. Sql Server имеет свои собственные пространственные типы, но у Oracle будут свои собственные пространственные типы. Пространственный провайдер должен преобразовывать пространственные типы EF в типы, которые понимает база данных. Поскольку вы используете SqlServer, поставщик пространственных данных SqlServer переводит типы DbGeometry и DbGeography в типы, специфичные для сервера Sql. Сервер Sql не понимает DbGeography или DbGeometry. – Pawel

+0

Но этот код не использует SQL Server; это всего лишь одна строка кода .NET. Im не взаимодействует с базой данных вообще. Что делать, если я хотел бы построить геопространственное приложение в памяти? Почему я не могу это сделать только с .NET? – craigtadlock

+0

Построение всей пространственной функциональности выходит за рамки Entity Framework, и это будет копирование того, что уже было сделано командой SqlServer. У нас нет опыта, и мы предпочли бы потратить это время на новые возможности Entity Framework. Если вам нужно использовать пространственные типы без базы данных, вам, вероятно, будет лучше использовать специализированную библиотеку типов, которая фокусируется исключительно на пространственной функциональности. Вероятно, он тоже будет работать лучше. – Pawel

ответ

13

DefaultSpatialServices в Entity Framework используют типы SqlGeography и SqlGeometry в качестве типов поддержки. Эти два типа живут в сборке Microsoft.SqlServer.Types.dll, которая не является частью .NET Framework. Исключение возникает, когда EF не может найти эти типы (исключение может быть более полезным ...). Когда вы устанавливаете Visual Studio, он установит localdb на вашем компьютере (или у вас может быть база данных SqlExpress), и это, вероятно, так, как вы получили тип на работающем компьютере. На компьютере, где установлена ​​только .NET Framework, а не Sql Server, у вас не будет этих типов. Вы можете установить SqlExpress в поле, где вы получаете исключение, или можете попробовать установить только те типы. Я не уверен, где взять сборку, но я думаю, что пакет функций Sql Server (http://www.microsoft.com/en-us/download/details.aspx?id=27596) может иметь его. Поддерживаются типы из SqlServer 2008 и SqlServer 2012, поэтому не имеет значения, какая версия вы устанавливаете.

EDIT

В EF6 исключение будет содержать более сообщение см: пункт https://entityframework.codeplex.com/SourceControl/changeset/b3eca2c141c0fb517504f9731dc8ba7a9c5727ee

Работа используется для отслеживания этой ошибки: https://entityframework.codeplex.com/workitem/3

+0

Спасибо! Ты прав. Я обновляю вопрос с ответом. – craigtadlock

+0

@Pawel Я использую тип DbGeography на Azure и столкнулся с этой проблемой. Как установить это на Azure.Can Я просто включил Microsoft.SqlServer.Types.dll в свой веб-проект? – darwindave

+7

Nevermind. с помощью nuget Install-Package Microsoft.SqlServer.Types сделал трюк – darwindave

2

Возможно, кто-то может выделить darwindaves ответ:

Установите пакет nuget Microsoft.SqlServer.Types. В качестве альтернативы добавьте ссылки на:

c: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Types.dll и обязательно отметьте копию локально в свойствах.

0

В дополнение к добавлению

C: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ SDK \ ассамблей \ Microsoft.SqlServer.Types.длл

Я также необходимо добавить

SqlServerSpatial110.dll

После того, как мы добавили тех, кого он работал как шарм!