.NET 4.5 Beta DbGeography NotImplementedException

У меня есть совершенно новый сервер, на котором я установил .NET 4.5 Beta. Я получаю исключение NotImplemented при попытке использовать пространственные объекты. Этот код ...

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

Выкидывает это исключение ...

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

Если я устанавливаю полную бета-версию VS.NET 11, то код работает нормально. Есть идеи почему? Чего не хватает?

UPDATE FOR ANSWER

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

Microsoft & # XAE; Типы системных CLR для Microsoft & # xAE; SQL Server & # xAE; 2012 http://www.microsoft.com/download/en/details.aspx?id=29065

OPINION

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

 Rick Strahl28 мая 2012 г., 11:50
Хм ... Я добавил ссылку на Microsoft.SqlServer.Types и EFCF5, и я не вижу тип DbGeography. Это работает только с .NET 4.5 или также на 4.0?
 Pawel21 мар. 2013 г., 05:18
Извините, я пропустил ваш комментарий. В EF5 пространственные типы доступны только в .NET Framework 4.5. В EF6 пространственные типы доступны как в .NET Framework 4, так и .NET Framework 4.5.
 craigtadlock13 апр. 2012 г., 04:15
Но этот код не использует SQL Server; это всего лишь одна строка кода .NET. Я вообще не взаимодействую с базой данных. Что если бы я хотел создать геопространственное приложение в памяти? Почему я не могу сделать это только с .NET?
 Pawel13 апр. 2012 г., 00:53
Причина зависимости заключается в том, чтобы быть независимой от платформы. EF предоставляет пользователю типы DbGeography и DbGeometry (которые не зависят от платформы), но базы данных имеют свои собственные пространственные типы, которые они понимают. Sql Server имеет свои пространственные типы, но Oracle будет иметь свои пространственные типы. Пространственный поставщик должен преобразовывать пространственные типы EF в типы, которые понимает база данных. Поскольку вы используете SqlServer, конкретный пространственный поставщик SqlServer преобразует типы DbGeometry и DbGeography в конкретные типы Sql Server. Sql Server не понимает DbGeography или DbGeometry.
 Pawel13 апр. 2012 г., 18:33
Создание всей пространственной функциональности выходит за рамки Entity Framework, и оно будет копировать то, что уже было сделано командой SqlServer. У нас нет опыта, и мы бы лучше потратили это время на новые функции Entity Framework. Если вам нужно использовать пространственные типы без базы данных, вам, вероятно, будет лучше использовать специализированную библиотеку типов, которая фокусируется исключительно на пространственной функциональности. Это, вероятно, будет работать лучше тоже.

Ответы на вопрос(4)

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

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

дополнительных компонентов Microsoft SQL Server 2008 с пакетом обновления 3». оставил меня немного в неведении относительно того, что мне на самом деле нужно было установить на целевой машине, но в конце концов мне понадобилось только следующее:

ENU\x64\SQLSysClrTypes.msi

Решение Вопроса

и 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

 craigtadlock13 апр. 2012 г., 00:35
Спасибо! Ты прав. Я обновлю вопрос с ответом.
 21 мар. 2013 г., 04:38
Не берите в голову. с помощью nuget Install-Package Microsoft.SqlServer.Types добились цели
 21 мар. 2013 г., 04:17
@Pawel Я использую тип DbGeography в Azure и столкнулся с этой проблемой. Как установить это на Azure.? Могу ли я просто включить Microsoft.SqlServer.Types.dll в свой веб-проект?

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

Мне также нужно было добавить

SqlServerSpatial110.dll

Как только мы добавили те, это работало как шарм!

Ваш ответ на вопрос