2012-04-12 19 views
6

Mam zupełnie nowy serwer, na którym zainstalowałem redystrybucję .NET 4.5 Beta. Dostaję wyjątek Niezatwierdzony podczas próby użycia funkcji przestrzennych. Ten kod ....NET 4.5 Beta DbGeography NotImplementedException

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

Zgłasza ten wyjątek ...

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

Jeśli mogę zainstalować pełną VS.NET 11 Beta wówczas kod działa poprawnie. Jakieś pomysły, dlaczego? Czego brakuje?

UPDATE na odpowiedź

Dzięki Paweł. Musisz mieć zainstalowane typy SQL CLR. Można pobrać wersję 2012 pod tym linkiem:

typy CLR dla systemu Microsoft® SQL Server® Microsoft® 2012 http://www.microsoft.com/download/en/details.aspx?id=29065

OPINIA

I naprawdę nie rozumiem, dlaczego NET ma zależność od SQL Server. W tych klasach nie ma nic szczególnego. Rozumiem, że jest to prawdopodobnie historyczna sprawa, w której kod został pierwotnie napisany przez zespół SQL, a zespół .NET chciał go ponownie użyć. Nie jest jasne, czy jest to implementacja oparta na dostawcy. Lepszy komunikat o wyjątku pozwoliłby zaoszczędzić dzieło dnia.

+1

Powodem zależności jest niezależność od platformy. EF ujawnia użytkownikowi typy DbGeography i DbGeometry (które są niezależne od platformy), ale bazy danych mają swoje własne typy przestrzenne, które rozumieją. Sql Server ma własne typy przestrzenne, ale Oracle będzie posiadał własne typy przestrzenne. Dostawca przestrzenny musi tłumaczyć typy przestrzenne EF na typy, które rozumie baza danych. Ponieważ używasz SqlServer, specyficzny dla SqlServer dostawca przestrzenny tłumaczy typy DbGeometry i DbGeography na typy specyficzne dla serwera Sql. Sql Server nie rozumie DbGeography ani DbGeometry. – Pawel

+0

Ale ten kod nie używa serwera SQL; to tylko jedna linia kodu .NET. W ogóle nie wchodzę w interakcje z bazą danych. Co się stanie, jeśli chcę zbudować aplikację geoprzestrzenną w pamięci? Dlaczego nie mogę tego zrobić z właśnie .NET? – craigtadlock

+0

Budowanie całej funkcjonalności przestrzennej jest poza zakresem Entity Framework i kopiowałoby to, co zostało już zrobione przez zespół SqlServer. Nie mamy wiedzy i wolimy spędzić ten czas na nowych funkcjach Entity Framework. Jeśli chcesz używać typów przestrzennych bez bazy danych, prawdopodobnie lepiej będzie, jeśli użyjesz wyspecjalizowanej biblioteki typów, która skupia się wyłącznie na funkcjonalności przestrzennej. Prawdopodobnie też będzie działać lepiej. – Pawel

Odpowiedz

13

DefaultSpatialServices w Entity Framework używają typów SqlGeography i SqlGeometry jako typów kopii. Te dwa typy występują w zespole Microsoft.SqlServer.Types.dll, który nie jest częścią platformy .NET Framework. Wyjątek jest generowany, gdy EF nie może znaleźć tych typów (wyjątek może być bardziej pomocny ...). Podczas instalacji Visual Studio zainstaluje on localdb na twoim komputerze (lub możesz już mieć bazę danych SqlExpress) i jest to prawdopodobnie sposób, w jaki masz typ działającego komputera. Na komputerze, na którym jest zainstalowany tylko system .NET Framework, a nie serwer Sql, nie będziesz mieć tych typów. Możesz zainstalować SqlExpress na pudełku, gdzie pojawi się wyjątek lub możesz spróbować zainstalować tylko typy. Nie jestem pewien, skąd wziąć sam zestaw, ale myślę, że pakiet funkcji serwera SQL (http://www.microsoft.com/en-us/download/details.aspx?id=27596) może go mieć. Typy SqlServer 2008 i SqlServer 2012 są obsługiwane, więc nie powinno mieć znaczenia, którą wersję zainstalujesz.

EDIT

W EF6 wyjątek będzie zawierał lepszą wiadomość patrz: pozycja https://entityframework.codeplex.com/SourceControl/changeset/b3eca2c141c0fb517504f9731dc8ba7a9c5727ee

Pracuj wykorzystywane do śledzenia tego błędu: https://entityframework.codeplex.com/workitem/3

+0

Dzięki! Masz rację. Znowu zaktualizuję pytanie za pomocą odpowiedzi. – craigtadlock

+0

@Pawel Używam DbGeography na Azure i napotkam ten problem. Jak zainstalować to na Azure.? Czy mogę dołączyć Microsoft.SqlServer.Types.dll do mojego projektu internetowego? – darwindave

+7

Nieważne. za pomocą pakietu instalacyjnego nuget Microsoft.SqlServer.Types załatwił sprawę – darwindave

2

Może ktoś może podświetlić darwindaves odpowiedź:

Zainstaluj pakiet nuget Microsoft.SqlServer.Types. Możesz również dodać odniesienia do:

c: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Types.dll i pamiętaj, aby oznaczyć kopię lokalną we właściwościach.

0

Oprócz dodawania

c: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ SDK \ złożeniach \ Microsoft.SqlServer.Types.dll

Musiałem także dodać

SqlServerSpatial110.dll

Gdy dodaliśmy ci to działało jak urok!